Перенаправление на IdP с добавленным параметром строки запроса - PullRequest
0 голосов
/ 12 сентября 2018

Я использую IdentityServer4 и настроил поставщика OpenId Connect. Я хочу передать имя пользователя провайдеру как часть строки запроса, чтобы поставщик предварительно заполнил поле имени пользователя. У меня есть как ADFS, так и Azure AD провайдеры, и я хотел бы, чтобы эта функция работала с обоими. Возможно ли это, и если да, то как?

В методе Challenge на ExternalController я добавил то, что, по моему мнению, должно работать, но оно ничего не делает:

[HttpGet]
public async Task<IActionResult> Challenge(string provider, string returnUrl, string user)
{
    if (string.IsNullOrEmpty(returnUrl)) returnUrl = "~/";
    if (Url.IsLocalUrl(returnUrl) == false && _interaction.IsValidReturnUrl(returnUrl) == false)
    {
        throw new Exception("invalid return URL");
    }
    if (AccountOptions.WindowsAuthenticationSchemeName == provider)
    {
        return await ProcessWindowsLoginAsync(returnUrl);
    }
    else
    {
        var props = new AuthenticationProperties
        {
            RedirectUri = Url.Action(nameof(Callback)),
            Items =
            {
                { "returnUrl", returnUrl },
                { "scheme", provider },
                { "login_hint", user }
            }
        };
        return Challenge(props, provider);
    }
}

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете достичь того, что ищете, используя свойство 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 (который работает, конечно).

...