代码之家  ›  专栏  ›  技术社区  ›  Rush Frisby

重定向到添加了querystring参数的IdP

  •  1
  • Rush Frisby  · 技术社区  · 6 年前

    我正在使用IdentityServer4并配置了OpenId连接提供程序。我要做的是将用户名作为querystring的一部分传递给提供者,以便提供者预先填充username字段。我有两个ADFS和Azure广告提供商,并希望这一功能与这两个工作。这可能吗?如果可能,怎么可能?

    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 回复  |  直到 6 年前
        1
  •  2
  •   Kirk Larkin    6 年前

    您可以使用 OnRedirectToIdentityProvider 财产 OpenIdConnectEvents 班级:

    在重定向到身份提供程序进行身份验证之前调用。这可以用来设置协议消息状态将通过身份验证过程持久化。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 上面的代码从查询字符串参数中读取 用户 StringValues 这里)并将其设置为 LoginHint 财产,如果找到的话。

    注意:我已经用 https://demo.identityserver.io (这当然管用)。