我对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管道?