ASP.NET Core标识将错误的NameClaimType与OpenIdConnect一起使用

时间:2018-10-01 05:47:01

标签: asp.net-core asp.net-identity openid-connect

我正在使用OpenIdConnect中间件对AzureAD进行身份验证。身份处理所有这些。

在脚手架的ExternalLogin页面上,我收到了正确的SignUpInfo,其中的主体名称与预期的一样(全名)。在默认实现中,Identity丢弃此信息,并使用电子邮件地址作为主体名称。相应的主体名称(全名)永远不会保留。

我已经看到这两个使用不同的NameClaimTypes。但是,在AddIdentity(...)或AddOpenIdConnect(...)上进行配置不会更改任何内容。

我应该如何处理?

更新

Startup.cs

        var authenticationMethods = services.AddAuthentication()
            .AddOpenIdConnect(authenticationScheme, authenicationDisplayName, options =>
            {
                options.ClientId = azureAdOptions.ClientId;
                options.ClientSecret = azureAdOptions.ClientSecret;
                options.Authority = $"{azureAdOptions.Instance}common/v2.0";
                options.CallbackPath = azureAdOptions.CallbackPath;
                options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
                options.SaveTokens = true;
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuer = true,
                    ValidIssuer = $"{azureAdOptions.Instance}{azureAdOptions.TenantId}/v2.0",
                    NameClaimType = "name"
                };
                options.Events.OnRemoteFailure = context =>
                {
                    logger.LogError(context.Failure, "Fehler beim Anmelden via XYZ");

                    context.Response.Redirect("/");
                    context.HandleResponse();

                    return Task.CompletedTask;
                };

                azureAdOptions.Scopes.ForEach(options.Scope.Add);
            });

        // Fügt die ASP.NET CORE Identity Middleware hinzu
        services.AddIdentity<TUser, IdentityRole>()
            .AddRoleManager<RoleManager<TRole>>()
            .AddDefaultUI()
            .AddDefaultTokenProviders()
            .AddEntityFrameworkStores<TContext>();

ExternalLogin.cshtml.cs(默认的脚手架代码)

        // Sign in the user with this external login provider if the user already has a login.
        var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor : true);
        if (result.Succeeded)
        {
            await _signInManager.UpdateExternalAuthenticationTokensAsync(info);

            _logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider);
            return LocalRedirect(returnUrl);
        }

此处,info.Principal.Identity.Name代表可读的全名,该全名是从OpenIdConnect的NameClaimTypes'name'派生而来的。但是登录后,身份将NameClaimTypes使用'XML-Namespace',并且在每个Controller中,User.Identity.Name都会解析为用户名/电子邮件地址。

0 个答案:

没有答案