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
разрешается на имя пользователя / адрес электронной почты.