我正在 .NET8 API 中生成 JWT 令牌,以便在用户登录时发出。
在 jwt.io 中测试时,处理令牌生成的逻辑似乎可以生成有效令牌,但是在生成令牌后,我立即尝试使用我的 program.cs 类中包含的相同验证参数来验证它。并收到以下异常 -
Microsoft.IdentityModel.Tokens.SecurityTokenInvalidIssuerException:IDX10211:无法验证颁发者。 'issuer' 参数为 null 或空格
解码器似乎无法在我的有效负载中找到 iss: 声明,尽管它确实存在于 jwt.io 内部
代币代码-
var authConfig = new JwtConfig();
_configuration.GetSection("JwtConfig").Bind(authConfig);
var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(authConfig.Key));
var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256);
var userClaims = new List<Claim>
{
new(ClaimTypes.NameIdentifier, input.Id.ToString()),
new(ClaimTypes.Name, input.Name),
new(ClaimTypes.Email, input.Email)
};
foreach (var role in input.Roles)
{
userClaims.Add(new(ClaimTypes.Role, role));
}
var tokenConfig = new JwtSecurityToken(
issuer: authConfig.Issuer,
audience: authConfig.Audience,
claims: userClaims,
expires: DateTime.UtcNow.AddMinutes(authConfig.JwtTimeoutInMinutes),
signingCredentials: credentials);
var token = new JwtSecurityTokenHandler().WriteToken(tokenConfig);
// temporary testing
var handler = new JwtSecurityTokenHandler();
var validation = new TokenValidationParameters
{
ValidIssuer = "https://localhost:7208",
ValidAudience = "https://localhost:7208",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("82551957-F31C-465F-895F-99DD9B40507C")),
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true
};
SecurityToken validatedToken;
var test1 = handler.ReadJwtToken(token);
var test = handler.ValidateToken(token, validation, out validatedToken);
通过多次尝试和错误,我最终弄清了这个问题的真相。
问题似乎在于这两个 nuget 软件包的版本略有不同。
Microsoft.IdentityModel.Tokens
System.IdentityModel.Tokens.Jwt
一旦我确保这些共享相同的版本,我的解码就开始工作。这是很奇怪的表现,但希望这可以帮助其他人在未来。