Я использую IdentityServer 4 с клиентом Angular 10, который использует OIDC Client JS:
Чтобы перенаправить пользователя для входа в систему, я вызываю signinRedirect на клиенте Angular:
UserManager.signinRedirect(args)
Это перенаправляет на IdentityServer 4 Acccount для входа в систему / a> действие:
[HttpGet]
public async Task<IActionResult> Login(string returnUrl) {
var vm = await BuildLoginViewModelAsync(returnUrl);
if (vm.IsExternalLoginOnly) {
// we only have one option for logging in and it's an external provider
return RedirectToAction("Challenge", "External", new { scheme = vm.ExternalLoginScheme, returnUrl });
}
return View(vm);
}
Вопрос
У меня есть внешние поставщики Google и Facebook, настроенные на сервере идентификации.
Как использовать signinRedirect
и сообщить IdentityServer о необходимости использования внешнего поставщика, например Google, для входа в систему?
Я хотел бы обойти страницу входа в IdentityServer, где есть 3 варианта:
- Войти с именем пользователя и паролем
- Войти через Google
- Войти с Facebook
Таким образом, клиент Angular сообщит серверу Identity Server, какой метод входа в систему следует использовать.
Обновить
После некоторого исследования кажется, что в спецификации есть способ указать, какого провайдера использовать:
UserManager.signinRedirect({ acr_values: 'IdP:Google' }));
Затем на AccountController's BuildLogincView > есть следующее:
var context = await _interactionService.GetAuthorizationContextAsync(returnUrl);
if (request?.IdP != null && await _schemeProvider.GetSchemeAsync(request.IdP) != null) {
var local = request.IdP == IdentityServer4.IdentityServerConstants.LocalIdentityProvider;
Если я не ошибаюсь, условие IF
и следующий код предназначены для проверки того, какой поставщик входа в систему следует использовать: локальный или один из настроенных внешних поставщиков.
Я отлаживал context
и получил следующее:
AcrValues анализируется, но IdP свойства не определен.
Разве AcrValues не может решить эту проблему? Что мне не хватает?