我对 OWIN 或 ASP .NET 不是很熟悉,但我正在基于配置了个人用户帐户的 MVC 模板构建站点,并且遇到了 OWIN cookie 中间件的问题。我正在使用项目模板中提供的默认 ApplicationSignInManager
,并且我还使用 SignalR hub 进行一些实时工作。现在,在某些情况下,我想使用 SignalR 中心登录用户。这段代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
在 Controller 操作中效果很好,因为该操作将导致带有 Set-Cookie
header 的 HTTP 响应,该 header 将按预期设置 .AspNet.ApplicationCookie
并且进一步的请求将包含它。由于我是从 SignalR hub 而不是 Controller 返回一个值,所以我只是获取 cookie 并将其设置在 hub 的客户端方法中,以模拟 Controller 响应。
但是我似乎无法弄清楚如何找到 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 响应 Set-Cookie
header 的 cookie 中间件。
有没有办法解决这个问题,让我的用户登录 SignalR,然后在客户端重新启动连接,以便下一个 OnConnected
调用接收我手动设置的 cookie 并计算出正确的IPrincipal
来自它?我能否让 OWIN 管道在中心运行?
最佳答案
您没看错——直到请求结束和响应开始时,cookie 才会被设置。
无论如何,身份验证 cookie 始终设置为仅限 Http - 这意味着 JavaScript 无法访问该 cookie 以防止客户端 session 劫持。而且您正在尝试通过 JavaScript 设置 auth-cookie - 这有安全问题的味道。
我会放弃这个想法。而是通过不涉及任何 JS 的 Controller 操作登录用户,然后使用 SignalR - 更轻松、更安全。
关于asp.net-identity - 在 SignalR 中获取 OWIN 身份验证 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27950112/