[英]Obtain OWIN authentication cookie in SignalR
我对OWIN或ASP .NET不是很熟悉,但是我正在构建一个基于MVC模板的站点,并配置了个人用户帐户,我遇到了OWIN cookie中间件的问题。 我正在使用项目模板中提供的默认ApplicationSignInManager
,我还有一些SignalR hub用于实时工作。 现在,在某些情况下,我想登录用户使用SignalR集线器。 这段代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
在控制器操作中工作得很好,因为该操作将导致带有Set-Cookie
标头的HTTP响应,该标头.AspNet.ApplicationCookie
预期设置.AspNet.ApplicationCookie
,并且进一步的请求将包含它。 由于我从SignalR中心而不是控制器返回一个值,我虽然只是获取cookie并将其设置在hub的客户端方法中,以模拟控制器响应。
但是我似乎无法弄清楚如何找到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并从中找出正确的IPrincipal
? 我可以让OWIN管道在集线器中运行吗?
您正确读取它 - 在请求结束并且响应已开始之前,cookie未设置。
无论如何,身份验证cookie总是设置为Http-only - 这意味着JavaScript无法访问该cookie以防止客户端会话劫持。 而你正在尝试通过JavaScript设置auth-cookie - 这就是安全问题。
我会放弃这个想法。 而是通过控制器操作登录用户而不涉及任何JS,然后使用SignalR - 更容易,更安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.