2015-04-16 82 views
0

我有一個IIS託管的MVC 5應用程序,它使用Asp.Net Identity和OWIN通過.AspNet.ApplicationCookie進行身份驗證。從其中的一個觀點來看,我通過SignalR JS客戶端調用自主託管的SignalR集線器(運行在同一臺服務器上)的長時間運行方法。這些電話都按預期工作。我現在想用[Authorize(Roles =「Administrator」)]來裝飾我的中心。這已證明存在問題。在集線器方法中設置斷點表明Context.User爲空,即使.AspNet.ApplicationCookie顯然位於Context.RequestCookies中。當從IIS託管的MVC應用程序調用時,Context.User在自託管的SignalR中心爲空

這裏是(在一個窗口服務自託管),用於在輪轂引導:

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

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

下面是網絡應用程序在auth配置(在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下長期運行的集線器方法是否存在問題?

更新1 我嘗試添加TicketDataFormat = new TicketDataFormat(new MachineKeyDataProtector("ASP.NET Identity"))在我的樞紐配置的CookieAuthenticationOptions,但這並沒有幫助。當然,這似乎應該比現在更容易。

+0

代碼將幫助我們幫助您。 SignalR集線器的引導是什麼樣的? –

+0

託管在同一臺服務器上,但在同一個應用中?因爲我認爲默認情況下,Asp.net標識僅爲同一應用共享憑據,而不是服務器 –

+0

@ bto.rdz,因此集線器作爲Windows服務自行託管,因此它不在與MVC 5相同的應用中在IIS中託管的應用程序。 –

回答

相關問題