【发布时间】:2015-03-13 01:26:19
【问题描述】:
我对 OWIN 或 ASP .NET 不是很熟悉,但我正在构建一个基于 MVC 模板并配置了个人用户帐户的站点,并且遇到了 OWIN cookie 中间件的问题。我正在使用项目模板中提供的默认 ApplicationSignInManager,并且我还有 SignalR hub 用于一些实时工作。现在,在某些情况下,我想使用 SignalR 集线器登录用户。这段代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
在控制器操作中效果很好,因为该操作将导致带有 Set-Cookie 标头的 HTTP 响应,该标头将按预期设置 .AspNet.ApplicationCookie 并且进一步的请求将包含它。由于我是从 SignalR 集线器而不是控制器返回值,因此我只是获取 cookie 并将其设置在集线器的客户端方法中,以模拟控制器响应。
但是我似乎无法弄清楚如何找到 cookie 值。
我基本上浏览了IOwinContext 中的所有内容,但找不到cookie。我可以找到登录的ClaimsIdentity 就好了,不是cookie,我想。我已经阅读了一些内容,我认为这是因为实际设置 cookie 的中间件在我查找 cookie 时尚未执行。它可能根本不会执行,因为在集线器中,我什至不知道我是否在 OWIN 管道中。我只是这样做:
HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>().PasswordSignInAsync()
我尝试像这样添加自己的中间件:
app.Use(async (context, next) => { await next; });
但是这个中间件根本没有受到影响,这让我想到通过在 SignalR 中获取 ApplicationSignInManager 我正在创建 IPrincipal,是的,但是没有其他任何事情发生,即执行将设置 HTTP 响应的 cookie 中间件Set-Cookie 标头我要。
有没有办法可以解决这个问题,让我的用户登录 SignalR,然后在客户端上重新启动连接,以便下一个 OnConnected 调用接收我手动设置的 cookie 并从中计算出正确的 IPrincipal ?我可以让 OWIN 管道在集线器中运行吗?
【问题讨论】:
标签: asp.net-identity owin signalr-hub