asp.net-identity - 在 SignalR 中获取 OWIN 身份验证 cookie

标签 asp.net-identity owin signalr-hub

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

Get<ApplicationSignInManager>().PasswordSignInAsync(…)

在 Controller 操作中效果很好,因为该操作将导致带有 Set-Cookie header 的 HTTP 响应,该 header 将按预期设置 .AspNet.ApplicationCookie 并且进一步的请求将包含它。由于我是从 SignalR hub 而不是 Controller 返回一个值,所以我只是获取 cookie 并将其设置在 hub 的客户端方法中,以模拟 Controller 响应。

但是我似乎无法弄清楚如何找到 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 响应 Set-Cookie header 的 cookie 中间件。

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

最佳答案

您没看错——直到请求结束和响应开始时,cookie 才会被设置。

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

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

关于asp.net-identity - 在 SignalR 中获取 OWIN 身份验证 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27950112/

相关文章:

c# - 使用 SignalR 和 IProgress 接口(interface)的进度报告

c# - 同一数据库中的两个 IdentityDbContext

asp.net - 如何将 AspNet Identity 版本 2 或 2.1 Alpha 中的 UserId 更改为 Identity int

asp.net - 错误: SignalRRouteExtension.Mapconnection is obsolete. use MapSignalR in Owin Startup class

SignalR 授权集线器连接

signalr - 如果 SignalR 集线器托管在多台服务器上怎么办?

c# - IdentityServer4 with ASP.NET Core 2.1 Identity - 加载外部登录信息时出错

asp.net-mvc - 如何使用 StructureMap 配置 ASP.NET Identity ApplicationUserManager

Ninject Topshelf Microsoft.Owin.Hosting

asp.net-mvc - MVC5 OWIN ws-federation AuthenticationManager.GetExternalLoginInfoAsync() 返回 null