我部署具有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/

10-09 04:26