【问题标题】:Obtain OWIN authentication cookie in SignalR在 SignalR 中获取 OWIN 身份验证 cookie
【发布时间】:2015-03-13 01:26:19
【问题描述】:

我对 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,是的,但是没有其他任何事情发生,即执行将设置 HTTP 响应的 cookie 中间件Set-Cookie 标头我要。

有没有办法可以解决这个问题,让我的用户登录 SignalR,然后在客户端上重新启动连接,以便下一个 OnConnected 调用接收我手动设置的 cookie 并从中计算出正确的 IPrincipal ?我可以让 OWIN 管道在集线器中运行吗?

【问题讨论】:

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


    【解决方案1】:

    您没看错 - 直到请求结束和响应开始后才设置 cookie。

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

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

    【讨论】:

    • 是的,我现在正在修改应用程序以改用控制器操作。当我想到它时,cookie 仅是 HTTP 是有道理的。很遗憾,我想,我也希望它通过集线器。感谢您的回答!
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2015-10-09
    • 2023-03-31
    • 2018-06-17
    • 2017-05-06
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多