在SignalR中获取OWIN身份验证cookie

时间:2015-01-14 18:38:25

标签: asp.net-identity owin signalr-hub

我对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管道在集线器中运行吗?

1 个答案:

答案 0 :(得分:4)

您正确读取 - 在请求结束并且响应已开始之前,cookie未设置。

无论如何,身份验证cookie总是设置为Http-only - 这意味着JavaScript无法访问该cookie以防止客户端会话劫持。而你正在尝试通过JavaScript设置auth-cookie - 这有点安全问题。

我会放弃这个想法。而是通过控制器操作登录用户而不涉及任何JS,然后使用SignalR - 更容易和更安全。