ASP.NET Core Identity использует неправильный NameClaimType с OpenIdConnect

Я использую промежуточное ПО 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 представляет читаемое полное имя, которое получено из NameClaimTypes 'name' из OpenIdConnect. Но после входа в систему Identity использует "пространство имен XML" для NameClaimTypes и в каждом контроллере User.Identity.Name разрешается на имя пользователя / адрес электронной почты.

0 ответов

Другие вопросы по тегам