У нас есть веб-приложение MVC с интегрированным AnjularJS (устаревший продукт) и развернутое как веб-приложение.Мы предоставляем ApiControllers для вызовов Ajax из скрипта AngularJS. У нас есть несколько экземпляров этого приложения, работающих за балансировщиком нагрузки.Недавно мы интегрировали Azure AD для аутентификации и используем поток OpenIDConnect.Вход пользователя в систему завершается успешно, но последующие запросы (вызовы Ajax) к ApiControllers случайным образом завершаются с ошибкой «Несанкционированный».
Настройка аутентификации OpenIDCOnnect
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
ClientId = "XXXXX",
Authority = "https://login.microsoftonline.com/xxxx.onmicrosoft.com",
PostLogoutRedirectUri = @"https://localhost:44360/",
});
}
Затем каждый MVC и APIконтроллер помечен атрибутом Authorize
[Authorize]
public class HomeController : Controller
Наш анализ
Мы подозреваем, что эта проблема может быть связана с тем, что приложение запускает несколько экземпляров, и во время входа в систему будет установлен сеансс этим конкретным случаем.Последующие запросы передаются другим экземплярам случайным образом, и экземпляр не имеет информации о сеансе.При развертывании только одного экземпляра приложения эта ошибка не отображается.
Вопросы
- Когда я читаю в Интернете о Azure AD, рекомендуемый способAjax вызывает использование неявного потока ADAL.js.Поскольку наше приложение не является одностраничным, я не уверен, что это будет правильным выбором.Мы хотим посмотреть, сможем ли мы решить эту проблему, придерживаясь OpenIDConnect.
- Есть ли способ сохранить информацию о сеансе в распределенном хранилище, чтобы несколько экземпляров приложения могли обмениваться ею?Я вижу интерфейс IAuthenticationSessionStore в CookieAuthenticationOptions , который может использоваться, но не находит достаточно информации о его назначении.