在 SignalR 中获取 OWIN 身份验证 cookie
Obtain OWIN authentication cookie in SignalR
我对 OWIN 或 ASP .NET 不是很熟悉,但我正在基于配置了个人用户帐户的 MVC 模板构建站点,我 运行 OWIN cookie 有问题中间件。我正在使用项目模板中提供的默认值 ApplicationSignInManager
,并且我还有一些 real-time 工作的 SignalR 中心。现在,在某些情况下,我想使用 SignalR 中心登录用户。此代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
在控制器操作中效果很好,因为该操作将导致带有 Set-Cookie
header 的 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
header 我正在寻找。
有没有办法解决这个问题,让我的用户登录 SignalR,然后在客户端重新启动连接,以便下一个 OnConnected
调用接收我手动设置的 cookie 并计算出正确的 IPrincipal
从中呢?我可以在集线器中创建 OWIN 管道 运行 吗?
您没有看错 - 在请求结束和响应开始之前不会设置 cookie。
无论如何,身份验证 cookie 始终设置为仅限 Http - 这意味着 JavaScript 无法访问该 cookie 以防止客户端会话劫持。而且您正在尝试通过 JavaScript 设置 auth-cookie - 有安全问题的味道。
我会放弃这个想法。而是通过不涉及任何 JS 的控制器操作登录用户,然后使用 SignalR - 更简单、更安全。
我对 OWIN 或 ASP .NET 不是很熟悉,但我正在基于配置了个人用户帐户的 MVC 模板构建站点,我 运行 OWIN cookie 有问题中间件。我正在使用项目模板中提供的默认值 ApplicationSignInManager
,并且我还有一些 real-time 工作的 SignalR 中心。现在,在某些情况下,我想使用 SignalR 中心登录用户。此代码:
Get<ApplicationSignInManager>().PasswordSignInAsync(…)
在控制器操作中效果很好,因为该操作将导致带有 Set-Cookie
header 的 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
header 我正在寻找。
有没有办法解决这个问题,让我的用户登录 SignalR,然后在客户端重新启动连接,以便下一个 OnConnected
调用接收我手动设置的 cookie 并计算出正确的 IPrincipal
从中呢?我可以在集线器中创建 OWIN 管道 运行 吗?
您没有看错 - 在请求结束和响应开始之前不会设置 cookie。
无论如何,身份验证 cookie 始终设置为仅限 Http - 这意味着 JavaScript 无法访问该 cookie 以防止客户端会话劫持。而且您正在尝试通过 JavaScript 设置 auth-cookie - 有安全问题的味道。
我会放弃这个想法。而是通过不涉及任何 JS 的控制器操作登录用户,然后使用 SignalR - 更简单、更安全。