使用添加的querystring参数重定向到IdP

时间:2018-09-12 14:37:22

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

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

Challenge的{​​{1}}方法中,我添加了我认为应该有效的方法,但它无能为力:

ExternalController

1 个答案:

答案 0 :(得分:1)

您可以使用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属性(如果找到)的原因。

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