2015-04-16 3 views
0

У меня есть приложение MVC 5, поддерживающее IIS, которое использует аутентификацию Asp.Net и OWIN для аутентификации через .AspNet.ApplicationCookie. Из одного из своих представлений я звоню на длительные методы на самообслуживаемом концентраторе SignalR (работает на том же сервере) через клиент SignalR JS. Эти звонки работают так, как ожидалось. Теперь я хочу украсить свой концентратор [Authorize (Roles = «Administrator»)]. Это оказалось проблематичным. Установка точки останова в хаб-методе показывает, что Context.User имеет значение null, хотя .AspNet.ApplicationCookie явно находится в Context.RequestCookies.Context.User имеет значение null в самообслуживаемом концентраторе SignalR при вызове из приложения MVC, размещенного в IIS.

Вот самозагрузки для концентратора (резидентных в службе Windows):

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

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

Вот аутентификации конфигурации для веб-приложения (размещенных в 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: Возможно ли использование [Авторизовать] в описанном выше сценарии? Если да, то как?

Вопрос 2: Было бы лучше просто объединить самообслуживаемый концентратор в хостинг-приложение IIS? Если да, есть ли какие-либо проблемы с долгосрочными методами хабов в IIS?

Update 1 Я попытался добавление TicketDataFormat = new TicketDataFormat(new MachineKeyDataProtector("ASP.NET Identity")) к CookieAuthenticationOptions на узловой конфигурации, но это не помогло. Конечно, похоже, это должно быть проще, чем есть.

+0

Код поможет нам вам помочь. Как выглядит бутстрап концентратора SignalR? –

+0

размещен на том же сервере, но находится в том же приложении? потому что я думаю, что по умолчанию Asp.net Identity использует учетные данные только для одного и того же приложения, а не для сервера –

+0

@ bto.rdz. Концентратор централизованно размещен как служба Windows, поэтому он не находится в том же приложении, что и MVC 5 приложение, которое размещено в IIS. –

ответ

Смежные вопросы