只是试图理解一个问题,在我的头脑中,这似乎是一个错误的微软System.Security dll,但可能是我做错了一些事情。
我正在尝试自定义实现JWT令牌。我创建索赔和令牌:
var claimsIdentity = new ClaimsIdentity(new List<System.Security.Claims.Claim>()
{
new System.Security.Claims.Claim(ClaimTypes.Sid, "1"),
new System.Security.Claims.Claim(ClaimTypes.Role, "1"),
},"Custom");
var securityTokenDescriptor = new SecurityTokenDescriptor()
{
AppliesToAddress = Keys.Core.WebsiteDomain,
TokenIssuerName = Keys.Core.WebsiteDomain,
Subject = claimsIdentity,
SigningCredentials = signingCredentials,
};
var tokenHandler = new JwtSecurityTokenHandler();
var plainToken = tokenHandler.CreateToken(securityTokenDescriptor);
var signedAndEncodedToken = tokenHandler.WriteToken(plainToken);
return signedAndEncodedToken;然后检索令牌和用户(SID)和角色值:
var roleId = stream.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Role).Value;
var userId = stream.Claims.SingleOrDefault(x => x.Type == ClaimTypes.Sid).Value;验证功能:
private static JwtSecurityToken Validate(string signedAndEncodedToken)
{
var tokenHandler = new CustomJwtSecurityTokenHandler();
var plainTextSecurityKey = Keys.Security.TokenSecret;
var signingKey = new InMemorySymmetricSecurityKey(
Encoding.UTF8.GetBytes(plainTextSecurityKey));
var tokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = signingKey
};
SecurityToken validatedToken;
tokenHandler.ValidateToken(signedAndEncodedToken, tokenValidationParameters, out validatedToken);
var jwtToken = validatedToken as JwtSecurityToken;
return validatedToken as JwtSecurityToken;
}现在,我的UserID (ClaimType.SID)似乎返回正确,但我的RoleId (ClaimType.Role)作为不存在返回。如果我更改了x.Type ==的“角色”,它就会正常工作。
对Claim.Type SID的检查显示为:http://schemas.xmlsoap.org/ws/2005/05/identity/claims/sid
但是Claim.Type角色显示为:角色。
ClaimTypes.Role具有完整的架构路径。
这是个窃听器还是我漏掉了什么?
发布于 2020-05-15 16:44:32
我意识到有些时候已经过去了,但作为一个对此感到惊讶的人,我确实在JwtSecurityToken.Claims属性上遇到了这样的评论:
根据Claim.Type JwtSecurityTokenHandler.InboundClaimTypeMap的说法,的索赔将不会被翻译成。
因此,如果您想在解码令牌中搜索时使用ClaimTypes,只需在字典中运行它,就可以知道您没有疯或者做了任何错误的事情。
Assert.Equal(
"Nicholas Piasecki",
parsedToken
.Claims
.Single(x =>
{
var map = JwtSecurityTokenHandler.DefaultInboundClaimTypeMap;
if (map.TryGetValue(x.Type, out var mapped))
{
return mapped == ClaimTypes.GivenName;
}
return false;
})
.Value);https://stackoverflow.com/questions/42173057
复制相似问题