![](/img/trans.png)
[英]How to add a database retrieved value custom claim to JWT Token using ServiceStack
[英]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.