我对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
,是的,但是没有其他事情发生,即执行cookie中间件设置我所追求的HTTP响应Set-Cookie
标题。
有没有办法可以解决这个问题并让我的用户登录SignalR,然后重新启动客户端上的连接,以便下一个OnConnected
调用接收我手动设置的cookie并找出正确的{{1 }} 从中?我可以让OWIN管道在集线器中运行吗?
答案 0 :(得分:4)
您正确读取 - 在请求结束并且响应已开始之前,cookie未设置。
无论如何,身份验证cookie总是设置为Http-only - 这意味着JavaScript无法访问该cookie以防止客户端会话劫持。而你正在尝试通过JavaScript设置auth-cookie - 这有点安全问题。
我会放弃这个想法。而是通过控制器操作登录用户而不涉及任何JS,然后使用SignalR - 更容易和更安全。