【发布时间】:2021-09-02 04:09:14
【问题描述】:
ASP.NET Core 有自己的标准声明映射。 Read this 看看这个GitHub repository
我正在使用 Azure AD,NET5。
问题是 unique_name 被映射到 name,如果你真的很幸运,你最终会得到两个名称声明。对我来说,一个是我的全名,一个是我的电子邮件。
处理重复名称声明的代码。
string email = null;
var nameClaims = httpCtx.User
.FindAll(x => x.Type.Equals(ClaimTypes.Name))
.Where(x => x.Value.Contains("@")).ToList();
if(nameClaims.Any())
{
email = nameClaims.First().Value;
}
添加授权的代码。
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
options.Authority = openIdConnectOptions.Authority;
options.TokenValidationParameters.ValidIssuer = openIdConnectOptions.ValidIssuer;
options.TokenValidationParameters.ValidAudiences = openIdConnectOptions.ValidAudiences;
options.MapInboundClaims = true;
});
如果您设置 MapInboundClaims = false 那么现在将有映射,并且所有声明都将保留名称。 这解决了我的重复名称声明问题,但也打破了角色在 ASP.NET Core 中的映射方式。
我想保留默认映射,并为我知道映射错误的类型添加我自己的映射。 或者删除所有映射并添加缺少的部分以使角色再次起作用。
【问题讨论】:
-
您可以操作静态的
JwtSecurityTokenHandler.DefaultInboundClaimType字典来自定义默认映射。 -
"[...] 但也打破了角色在 ASP.NET Core 中的映射方式"。这与 ASP.NET Core 无关,但 ClaimsIdentity 默认使用哪个声明来确定用户所属的角色。如果您关闭声明映射,“角色”声明将保持原样,因此您需要指示 JWT 堆栈改为使用该声明。您可以使用
options.TokenValidationParameters.RoleClaimType = "role";执行此操作。如果名称映射也被破坏,您可以对NameClaimType执行相同操作。
标签: asp.net-core azure-active-directory jwt