Допустим, мне нужно интегрироваться с устаревшей корпоративной системой, которая обслуживает пользователей. Предположим, что эта корпоративная система предоставляет C# SDK двумя способами:
Аутентификация:
sdk.Authenticate("Region", "Username", "Password")
Обратите внимание, что Region
— это дополнительный параметр, выбираемый пользователем при входе в систему. Поэтому мне нужно иметь возможность читать этот настраиваемый параметр в дополнение к учетным данным пользователя. (Да, вход в систему будет интерактивным).
Получение профиля:
sdk.GetProfile(UserId)
Я хочу использовать IdentityServer для создания токенов обычным способом, но использовать эти два метода для реализации пользовательской аутентификации и извлечения профиля.
Я вижу, что, расширив IProfileService
, я смогу интегрировать поиск профилей и заполнение пользовательских утверждений. Однако я вижу в документах следующие несколько точек расширения, но не уверен, что это лучший способ;
Метод Account Controller
пользовательского интерфейса быстрого запуска: я должен разместить здесь логику Login(LoginInputModel model, string button)
и просто вызвать _signInManager.SignInAsync для входа пользователя. Но мне не кажется, что я напрямую расширяю IdentityServer4, чтобы добавить поддержку другого пользовательского поставщика аутентификации.
IExtensionGrantValidator:
Этот ответ и Документы IdentityServer объясняют способ создания пользовательского гранта, который я должен использовать для вызова sdk.Authenticate("Region", "Username", "Password")
. Но это означало бы, что я буду использовать настраиваемый тип гранта. Мне нужно иметь возможность поддерживать существующие типы грантов, такие как Hybrid. Я вижу поддержку пользовательских параметров через параметр sdk.Authenticate("Region", "Username", "Password")
в методе context
IResourceOwnerPasswordValidator:
Этот документ IdentityServer объясняет, как реализовать собственный валидатор пароля для потока владельца ресурса. Но мне нужно иметь возможность поддерживать существующие типы грантов, такие как Hybrid. Я вижу поддержку пользовательских параметров через параметр ValidateAsync(ExtensionGrantValidationContext context)
в методе context
Внешние аутентификаторы:
Этот документ IdentityServer объясняет, как добавлять внешние аутентификаторы. Но я не вижу метода ValidateAsync(ResourceOwnerPasswordValidationContext context)
для нестандартных аутентификаторов. Я вижу поддержку только популярных аутентификаторов, таких как Google.
Что мне не хватает?
@d_f прав, вариант 1, скорее всего, то, что вы ищете здесь.
Я выбрал первый вариант, упомянутый в вопросе: метод Quick Start UI Account Controller
Login(LoginInputModel model, string button)
.
Вам нужна некоторая пользовательская страница входа для поддержки вашего дополнительного параметра, поэтому ваш выбор в любом случае 1. Опция 4 предназначена для перенаправления на внешнюю страницу входа, когда у вас есть только API. Варианты 2 и 3 не интерактивны, поэтому ваши требования оставили вам только один вариант, и я не вижу в этом проблемы :)