重定向到身份提供者时如何附加URL参数

时间:2018-09-13 13:29:53

标签: c# identityserver4

我想在重定向到Azure AD时附加一个login_hint参数。原因是我已经知道用户名,并且不想用户再次指定它。

在Identity Server中,我们像这样设置身份提供程序:

services.AddAuthentication()
    .AddOpenIdConnect()

从帐户控制器中,我们可以通过以下方式向身份提供者提出新的登录要求:

var properties = this.signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, userId);

return this.Challenge(properties, provider);

但是,我们如何在提供程序中添加附加参数,更具体地说,在用户将被重定向到的URL中包含附加参数? AuthenticationProperties中有一个字典,我们可以在其中添加任意数据,因此我猜我们可以在重定向用户之前将其消耗掉。

我知道协议消息中有whrdomain_hint(类似于我要实现的属性)属性,但是我们可以在何时何地访问这些属性或在其中添加自定义参数管道?

1 个答案:

答案 0 :(得分:3)

发布此消息不久后,我找到了解决方案。首先,我在AuthenticationProperties中添加userId。

var properties = this.signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl, userId);

properties.Items["userId"] = userId;

return this.Challenge(properties, provider);

注册身份提供者时,OpenIdConnectOptions中发生了一个事件,我们可以在其中设置LoginHint

services.AddAuthentication()
    .AddOpenIdConnect("test", "test", options =>
    {
        options.Authority = "xxx";
        options.ClientId = "xxx";
        options.Scope.Add(IdentityServerConstants.StandardScopes.OpenId);
        options.Scope.Add(IdentityServerConstants.StandardScopes.Profile);
        options.Scope.Add(IdentityServerConstants.StandardScopes.Email);
        options.TokenValidationParameters = new TokenValidationParameters
        {
            NameClaimType = ClaimsIdentity.DefaultNameClaimType,
            RoleClaimType = ClaimsIdentity.DefaultRoleClaimType
        };
        options.Events.OnRedirectToIdentityProvider = ctx =>
        {
            if (ctx.Properties.Items.TryGetValue("userId", out var userId))
            {
                ctx.ProtocolMessage.LoginHint = userId;
            }

            return Task.CompletedTask;
        };
    });