Asp.Net 认证后转换核心jwt令牌

Asp.Net Core jwt token is transformed after authentication

我有 email 声明的 Cognito ID 令牌。

  ..........
  "iat": 164456734,
  "jti": "81ac2634-e241-444f-88cf-eabf454644",
  "email": "david@mail.com"
}

但是,在 asp net core jwt 中间件身份验证电子邮件声明从 email 类型转换为 C# 中的 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress - ClaimTypes.Email 之后。

但后来我手动读取了令牌:

var token = new JwtSecurityTokenHandler().ReadJwtToken(jwtToken);
var claimsIdentity = new ClaimsIdentity(token.Claims);
var claimsPrincipal = new ClaimsPrincipal(claimsIdentity)

声明类型未转换并保持 email

为什么在 asp net 核心身份验证声明中转换为 http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress

我可以在不手动修改 Claims 列表的情况下手动创建具有此 email 声明转换的 claimsPrincipal 吗?

其实已经被理解为ClaimTypes.Email,然而这个属性返回的字符串是http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress(source).

令牌未被转换,除非专门这样做,而是被解析和理解为 ClaimTypes.Email,实际令牌未被修改。

因此,Microsoft 和 OpenIDConnect 对于电子邮件声明名称应该是什么有不同的意见,要禁用此重新映射,您可以执行以下任一操作:

public void ConfigureServices(IServiceCollection services)
{
    // By default, Microsoft has some legacy claim mapping that converts
    // standard JWT claims into proprietary ones. This removes those mappings.
    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();



    // Or set this flag to false
    .AddJwtBearer(opt =>
    {
        ...
        opt.MapInboundClaims = false;
    });