繁体   English   中英

在SignalR中获取OWIN身份验证cookie

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM