У меня есть приложение 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 на узловой конфигурации, но это не помогло. Конечно, похоже, это должно быть проще, чем есть.
Код поможет нам вам помочь. Как выглядит бутстрап концентратора SignalR? –
размещен на том же сервере, но находится в том же приложении? потому что я думаю, что по умолчанию Asp.net Identity использует учетные данные только для одного и того же приложения, а не для сервера –
@ bto.rdz. Концентратор централизованно размещен как служба Windows, поэтому он не находится в том же приложении, что и MVC 5 приложение, которое размещено в IIS. –