【问题标题】:Redirect to IdP with added querystring parameter使用添加的查询字符串参数重定向到 IdP
【发布时间】:2019-02-17 05:56:29
【问题描述】:

我正在使用 IdentityServer4 并配置了 OpenId Connect 提供程序。我想要做的是将用户名作为查询字符串的一部分传递给提供者,以便提供者预先填写用户名字段。我同时拥有 ADFS 和 Azure AD 提供程序,并且希望此功能可以同时使用。这可能吗?如果可以,怎么办?

ExternalControllerChallenge 方法中,我添加了我认为应该有效但没有任何作用的方法:

[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);
    }
}

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc identityserver4 openid-connect


    【解决方案1】:

    您可以使用 OpenIdConnectEvents 类的 OnRedirectToIdentityProvider 属性实现您想要的:

    在重定向到身份提供者进行身份验证之前调用。这可用于设置将在身份验证过程中持续存在的 ProtocolMessage.State。 ProtocolMessage 还可用于添加或自定义发送给身份提供者的参数。

    您通过AddOpenIdConnect 函数挂钩到此过程,该函数在Startup.ConfigureServices 中使用services.AddAuthentication 时被调用。下面是一个示例,说明这可能符合您的要求:

    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 属性(如果找到的话)。

    注意:我已经用https://demo.identityserver.io 对此进行了测试(当然可以)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-03
      • 2016-07-03
      • 1970-01-01
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多