Пулы пользователей AWS Cognito в мультитенантном веб-приложении - PullRequest
0 голосов
/ 28 января 2019

У нас есть одно веб-приложение .net Core MVC, которое будет использоваться несколькими клиентами.У каждого клиента будет несколько пользователей.

Мы намерены использовать AWS Cognito для аутентификации пользователей, и, читая об этом, я вижу, что пул пользователей для каждого клиента является одним из рекомендуемых маршрутов.Это хорошо работает для нашего варианта использования, так как клиент A может захотеть пользователя с именем пользователя «Bob», а клиент B может захотеть другого пользователя с именем пользователя «Bob».

Все, что я прочитал, предполагает, что это возможноно вот проблема:

В ядре .net я должен указать некоторые детали, относящиеся к конкретному пулу приложений при запуске:

                .AddOpenIdConnect(async options =>
            {
                options.ResponseType = OpenIdConnectResponseType.Code;

                options.ConfigurationManager = new ConfigurationManager<OpenIdConnectConfiguration>(
                                                services.BuildServiceProvider().GetService<IOpenIdDiscovery>().OpenIdConfigurationUrl(),
                                                new OpenIdConnectConfigurationRetriever(),
                                                services.BuildServiceProvider().GetService<System.Net.Http.HttpClient>());

                options.Authority = Configuration["OpenIdAuthority"];
                options.ClientId = Configuration["AuthCodeClientId"];
                options.ClientSecret = Configuration["AuthCodeClientSecret"];

Как мне получить приложениеиспользовать многопользовательские пулы?

Чтобы уточнить вышеизложенное, я полагаю, что идеальным решением было бы:

1) Мы направляем пользователя на определенный URL-адрес для входа в пул пользователей.2) После входа пользователь перенаправляется на центральный сайт.3) Мы каким-то образом определяем, в каком пользовательском пуле они проходили аутентификацию, и соответственно устанавливаем ClientId и ClientSecret для сеанса.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Мне пришлось решить аналогичную проблему на этой неделе.Очевидно, что .NET Core не поддерживает это из коробки, так как может вызвать некоторые сложные вопросы о проблемах аутентификации при работе с веб-сайтом с графическим интерфейсом: https://github.com/aspnet/Security/issues/1847

Я решал эту проблему в контекстеСервер API, однако, и было легко сделать несколько базовых предположений.

В конце концов я решил эту проблему, реализовав свой собственный класс JwtBearerHandler, который в основном совпадает с классом .NET Core, но перенастраивает * 1007.* на лету на основе информации в HTTP-запросе.Наиболее важные изменения можно найти здесь: https://github.com/tgittos/AmazonCognitoPrototype/blob/master/AmazonCognitoSpike/Auth/CognitoUserPoolResolver.cs

По сути, суть решения состоит в том, чтобы извлечь идентификатор из запроса в JwtBearerHandler и использовать его для перенастройки Audience и * 1013.* на JwtBearerOptions на основе того, что было сохранено в базе данных при поступлении запроса. Это не добавляет много накладных расходов к запросу и, кажется, работает достаточно хорошо.

Весь репозиторийЯ связал это подтверждение концепции, над которой я работал, чтобы заставить Cognito auth работать с несколькими пулами пользователей, так что, возможно, стоит потратить некоторое время на чтение лота.Это довольно грязно и включает в себя классы, которые мне не нужно было заменять.Основные изменения в CognitoUserPoolResolver, DSJwtBearerHandler и DSJwtBearerOptions.

0 голосов
/ 02 февраля 2019

Если я правильно понимаю, ключевой проблемой является определение пула пользователей Cognito, связанного с аутентифицированным пользователем.Чтобы решить, что токен ID, выданный Cognito, включает в себя утверждение iss, которое идентифицирует пул пользователей.

Подробнее здесь,

https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html

...