这是我用于生成令牌的代码:
var claims = new List<Claim>
{
new Claim(ClaimTypes.NameIdentifier, appUser.Id.ToString()),
new Claim(ClaimTypes.Name, appUser.UserName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim(ClaimTypes.Role, role));
}
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config.GetSection("AppSettings:Token").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
string issuer = _config["Token:Issuer"];
var jwtSecurityToken = new JwtSecurityToken(
issuer: issuer,
audience:issuer,
claims: claims,
expires: DateTime.Now.AddMinutes(5),
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256)
);
jwtSecurityToken.Header.Add("kid", requestAPIKey);
var token = new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);
令牌输出以下内容:
{
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier": "7",
"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name": "ligeros",
"exp": 1540619440,
"iss": "http://localhost:5000",
"aud": "http://localhost:5000"
}
我怎样才能使其输出呢?
{
"nameid": "7",
"unique_name": "ligeros",
"nbf": 1540613190,
"exp": 1540703190,
"iat": 1540613190
}
我不在乎nbf,exp和iat。我只希望删除URL并使其成为nameid,unique_name,而不是http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier和http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name。谢谢你!
答案 0 :(得分:1)
这很有用,但是并不能完全解决我的问题,该问题是由于某些jwt声明映射到.net声明而引起的,因此在此堆栈溢出中发现以下信息:Get short claim type name < / p>
在“关于”页面上检查声明时,您会注意到两件事:有些声明的类型名长于奇数,而且声明中的声明超出了您的应用程序所需。
长声明名称来自Microsoft的JWT处理程序,试图映射 .NET的ClaimTypes类类型的某些声明类型。你可以关掉 下面的代码行(在“启动”中)会出现这种情况。
这还意味着您需要调整以下配置 针对新的唯一子声明类型的反CSRF保护:
解决方法是在身份配置之前将其添加到您的启动中
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
对于较新版本的IdentityModel,该属性称为DefaultInboundClaimTypeMap:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
答案 1 :(得分:0)
我修复了它:
var claims = new List<Claim>
{
new Claim("nameid", appUser.Id.ToString()),
new Claim("unique_name", appUser.UserName)
};
var roles = await _userManager.GetRolesAsync(user);
foreach (var role in roles)
{
claims.Add(new Claim("roles", role));
}