当从 IIS 托管的 MVC 应用程序调用时,Context.User 在自托管的 SignalR 中心中为空

Context.User is null in self-hosted SignalR hub when called from IIS-hosted MVC app

我有一个 IIS 托管的 MVC 5 应用程序,它使用 Asp.Net Identity 和 OWIN 通过 .AspNet.ApplicationCookie 进行身份验证。从它的一个观点来看,我通过 SignalR JS 客户端在自托管 SignalR 集线器(运行 在同一服务器上)上调用 long-运行 方法。这些调用都按预期工作。我现在希望用 [Authorize(Roles = "Administrator")] 装饰我的中心。这已被证明是有问题的。在集线器方法中设置断点显示 Context.User 为空,即使 .AspNet.ApplicationCookie 显然在 Context.RequestCookies.

这是集线器的 bootstrap(在 windows 服务中自托管):

app.Map("/signalr", map =>
{
    map.UseCors(CorsOptions.AllowAll);
    map.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
    });

    var hubConfiguration = new HubConfiguration();
    map.RunSignalR(hubConfiguration);
});

这是 Web 应用程序的身份验证配置(托管在 IIS 中):

// Configure the db context, user manager and signin manager to use a single instance per request
app.CreatePerOwinContext(UserAccountContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in with a third party login provider
// Configure the sign in cookie
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromMinutes(30),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});

问题1:在上述场景中是否可以使用[Authorize]?如果可以,怎么做?

问题 2: 将自托管集线器合并到 IIS 托管应用程序会更好吗?如果是这样,IIS 下的 long-运行 集线器方法是否有任何问题?

更新 1 我已尝试将 TicketDataFormat = new TicketDataFormat(new MachineKeyDataProtector("ASP.NET Identity")) 添加到集线器配置的 CookieAuthenticationOptions 中,但这没有帮助。当然看起来这应该比现在更容易。

我最终将我的自托管集线器移到了我的 ASP.Net 应用程序中,它工作得很好。这似乎比在这个 SO 问题 OWIN Self-Host CookieAuthentication & Legacy .NET 4.0 Application / FormsAuthenticationTicket

中实施解决方法更容易且更易于维护