在SignalR中获取OWIN身份验证Cookie

3

我对OWIN或ASP .NET不是很熟悉,但我正在基于MVC模板构建一个网站,并配置了单个用户帐户,我在使用OWIN cookie中间件时遇到了问题。 我正在使用项目模板中提供的默认ApplicationSignInManager,并且我还有一些实时工作的SignalR hub。 现在,在某些情况下,我希望通过SignalR hub登录用户。 这段代码:

Get<ApplicationSignInManager>().PasswordSignInAsync(…)

在控制器操作中运行良好,因为该操作将导致带有Set-Cookie标头的HTTP响应,该标头将按预期设置.AspNet.ApplicationCookie并进一步请求将包含它。由于我从SignalR hub返回值而不是从控制器返回,因此我认为我只需获取cookie并将其设置在hub的客户端方法中,以模拟控制器响应。

但是,我似乎无法找到cookie值。

我已经查看了IOwinContext中的基本所有内容,但找不到cookie。我可以很好地找到已登录的ClaimsIdentity,但cookie却没有。我做了一些阅读,我认为这是因为实际设置cookie的中间件尚未在我寻找cookie的时候执行。它可能根本没有被执行,因为在hub中,我甚至不知道我是否在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信息?我是否可以在hub中运行OWIN管道?

1个回答

5

你读得没错 - 直到请求和响应开始后才设置cookie。

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

我建议放弃这个想法。相反,在没有任何JS参与的控制器操作中登录用户,然后使用SignalR进行工作 - 更容易且更安全。


是的,我现在正在重新设计应用程序以使用控制器操作。 如果我思考一下,那么将cookie设为HTTP-only是有道理的。 可惜,我也希望它通过中心传递。 谢谢你的回答! - Tomáš Hübelbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接