我正在使用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
都会解析为用户名/电子邮件地址。