我部署具有SignalR功能的Asp.Net Core应用程序(Gray.microsoft.aspnetcore.signalr.server程序包),并希望在Hub类中添加身份授权检查。
public class FooHub : Hub
{
private SignInManager<ApplicationUser> SignInManager;
public FooHub(SignInManager<ApplicationUser> SignInManager)
{
this.SignInManager = SignInManager;
}
//server method with authorization checking
public void Method()
{
if (!IsAuthorize()) return;
}
private bool IsAuthorize()
{
return SignInManager.IsSignedIn((ClaimsPrincipal)Context.User);
}
}
尽管我的用户已通过身份方案授权,但
SignInManager.IsSignedIn
返回false。在IsSignedIn方法的源代码中,我找到了代码(简化了):
return principal.Identities.Any(i => i.AuthenticationType == IdentityConstants.ApplicationScheme);
但是Hub.Context.User中有
AuthenticationType == null
(因此,IsSignedIn返回false)。我知道在控制器操作中,此字段是从HttpContext实例中挖掘的。问题是如何在Hub类中手动将其设置为IsSignedIn返回true?
最佳答案
对我来说,问题是因为Cookies.ApplicationCookie.AutomaticAuthenticate = false;
即在启动类中,标识配置应为
services.Configure<IdentityOptions>(options => {
// other configs
options.Cookies.ApplicationCookie.AutomaticAuthenticate = true;
});
因此,当客户端请求集线器方法时,将通过身份验证对它进行身份验证。
SignInManager.IsSignedIn
成功返回true关于c# - SignInManager IsSignedIn在SignalR集线器中返回false,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45665968/