簡體   English   中英

如何從 .NET Core 6.0 中的 JWT 安全令牌讀取自定義聲明值

[英]How to read custom claim value from JWT security token in .NET Core 6.0

我無法從 Bearer JWT 令牌中讀取令牌聲明。

登錄正常,HTTP 請求帶有一個有效的 JWT 令牌到后端。 登錄返回令牌。 這是我在服務器端的代碼:

程序.cs

builder.Services.AddAuthentication(m => {
    //m.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    m.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    m.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(conf => {
        conf.RequireHttpsMetadata = false;
    conf.SaveToken = true;
    conf.TokenValidationParameters = new TokenValidationParameters
   {
       ValidateIssuer = true,
       ValidateAudience = true,
       ValidIssuer = Configuration["JWT-Issuer"],
       ValidAudience = Configuration["JWT-Issuer"],
       IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT-Key"])),
       ClockSkew = TimeSpan.Zero,
};
});

當我取消注釋此行//m.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; postman 表示未經授權。 當它保持評論時,授權成功。

令牌在這里生成。

生成令牌方法:

private object GenerateJwtToken(string Id, string email, ApplicationUser appUser, string appUserRole, string FirstName)
        {
            List<Claim> claims = null;
            claims = new List<Claim> {
                new Claim(JwtRegisteredClaimNames.Email,email),
                new Claim(JwtRegisteredClaimNames.Jti, appUser.Id),
                new Claim("Role",appUserRole),
                new Claim("UserName",appUser.UserName),
                new Claim("TEMP", FirstName)
                }
            var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["JWT-Key"]));
            var cred = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
            var expire = DateTime.Now.AddDays(Convert.ToDouble(_configuration["JWT-Expiry"]));


            var token = new JwtSecurityToken(
                issuer: _configuration["JWT-Issuer"],
                audience: _configuration["JWT-Issuer"],
                claims: claims,
                expires: expire,
                signingCredentials: cred
                );


            return new JwtSecurityTokenHandler().WriteToken(token);

        }

當 JWT 不記名令牌傳遞給用[Authorize]裝飾的 API 調用並使用調試器進行測試時,它表明像 TEMP這樣的自定義聲明不存在於User.Claims列表中。

從令牌中讀取聲明

  string Email = User.Claims.SingleOrDefault(x => x.Type.Equals("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")).Value;
  string FirstName= User.Claims.SingleOrDefault(x => x.Type.Equals("TEMP")).Value;

在這里,可以成功讀取 email 但我無法從令牌中讀取 FirstName。 事實上, User.Claims沒有FirstName聲明(我的意思是所有自定義聲明都離開了 Registered JWT Default ClaimTypes),它只有默認的令牌參數,即電子郵件地址、ID、角色等。

我應該怎么辦? 我應該為此目的創建自定義身份驗證方案嗎?

在 AddJwtBearer 內部,令牌處理程序完成了一些重新映射,其中聲明被重命名,例如

email -> http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress

可以使用以下方法關閉此映射:

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

或設置:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
JwtSecurityTokenHandler.DefaultOutboundClaimTypeMap.Clear();

實際映射可以在這里找到

但是,我不確定為什么找不到 TEMP 聲明。 您在 controller 中的經過身份驗證的用戶中實際看到了什么聲明? 在某些情況下,某些聲明也被忽略。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM