Вы можете достичь того, что ищете, используя свойство OnRedirectToIdentityProvider
класса OpenIdConnectEvents
:
, вызываемое перед перенаправлением напровайдер идентификации для аутентификации.Это можно использовать для установки ProtocolMessage.State, который будет сохраняться в процессе аутентификации.ProtocolMessage также можно использовать для добавления или настройки параметров, отправляемых провайдеру идентификации.
Вы подключаетесь к этому процессу с помощью функции AddOpenIdConnect
, которая вызывается при использовании services.AddAuthentication
в Startup.ConfigureServices
.Вот пример того, как это может выглядеть для ваших требований:
services
.AddAuthentication(...)
.AddOpenIdConnect(options =>
{
...
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = ctx =>
{
if (ctx.HttpContext.Request.Query.TryGetValue("user", out var stringValues))
ctx.ProtocolMessage.LoginHint = stringValues[0];
return Task.CompletedTask;
}
};
});
В большинстве случаев это всего лишь стандартный код для добавления аутентификации, OIDC и регистрации обработчика события для события, описанного выше.Самая интересная часть это:
if (ctx.HttpContext.Request.Query.TryGetValue("user", out var stringValues))
ctx.ProtocolMessage.LoginHint = stringValues[0];
Поскольку ваше Challenge
действие из вашего вопроса получает user
из параметра строки запроса, приведенный выше код считывает параметр user
строки запроса иззапрос (их может быть несколько), поэтому у нас есть StringValues
здесь) и он устанавливается как свойство LoginHint
, если оно найдено.
Примечание: IЯ проверил это с https://demo.identityserver.io (который работает, конечно).