ASP.NET MVC с аутентификацией OpenIDConnect завершается неудачно с несколькими экземплярами запущенной службы - PullRequest
1 голос
/ 04 апреля 2019

У нас есть веб-приложение 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 

Наш анализ

Мы подозреваем, что эта проблема может быть связана с тем, что приложение запускает несколько экземпляров, и во время входа в систему будет установлен сеансс этим конкретным случаем.Последующие запросы передаются другим экземплярам случайным образом, и экземпляр не имеет информации о сеансе.При развертывании только одного экземпляра приложения эта ошибка не отображается.

Вопросы

  1. Когда я читаю в Интернете о Azure AD, рекомендуемый способAjax вызывает использование неявного потока ADAL.js.Поскольку наше приложение не является одностраничным, я не уверен, что это будет правильным выбором.Мы хотим посмотреть, сможем ли мы решить эту проблему, придерживаясь OpenIDConnect.
  2. Есть ли способ сохранить информацию о сеансе в распределенном хранилище, чтобы несколько экземпляров приложения могли обмениваться ею?Я вижу интерфейс IAuthenticationSessionStore в CookieAuthenticationOptions , который может использоваться, но не находит достаточно информации о его назначении.

1 Ответ

1 голос
/ 06 апреля 2019

Если это приложение JS, использующее приложение MVC для обслуживания запросов API / AJAX, то приложение MVC вообще не должно использовать файлы cookie. Он должен просто проверить id_token, переданный от клиента JS в заголовке авторизации. Ваше приложение не работает, вероятно, потому что вы пытаетесь использовать куки, шифровать их на одном сервере и затем пытаться использовать их на другом. Посмотрите здесь: https://docs.microsoft.com/en-us/azure/active-directory/develop/sample-v1-code#single-page-applications, особенно исходный код для класса Startup.Auth.cs: https://github.com/Azure-Samples/active-directory-angularjs-singlepageapp/blob/master/TodoSPA/App_Start/Startup.Auth.cs.

Если вы смешиваете парадигму SPA (JS) с обслуживанием обычного HTML, то вам придется выяснить, как использовать куки и токены. Хитрый и небезопасный.

...