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