为什么我的 JWT 令牌创建后无法验证? .NET 8.0

问题描述 投票:0回答:1

我正在 .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);
c# .net jwt .net-8.0
1个回答
0
投票

通过多次尝试和错误,我最终弄清了这个问题的真相。

问题似乎在于这两个 nuget 软件包的版本略有不同。

Microsoft.IdentityModel.Tokens
System.IdentityModel.Tokens.Jwt

一旦我确保这些共享相同的版本,我的解码就开始工作。这是很奇怪的表现,但希望这可以帮助其他人在未来。

© www.soinside.com 2019 - 2024. All rights reserved.