【问题标题】:JWT token invalid token error using ASP.NET Core使用 ASP.NET Core 的 JWT 令牌无效令牌错误
【发布时间】:2022-07-08 00:34:23
【问题描述】:

我正在创建一个 ASP.NET Core Web API。在此,我使用 JWT 令牌进行身份验证。我创建了一个用于测试的演示 SQL 数据库,并且正在使用 Fiddler 测试我的 API。我的Startup 类的ConfigureServices 方法如下所示:

public void ConfigureServices(IServiceCollection services)
{
    var authPol = new AuthorizationPolicyBuilder()
                                             .AddAuthenticationSchemes(
                                                             new string[] { JwtBearerDefaults.AuthenticationScheme })
                                             .RequireAuthenticatedUser()
                                             .Build();
                          
    services.AddControllers(
                config => 
                {
                    config.Filters.Add(new AuthorizeFilter(authPol));
                }).AddXmlSerializerFormatters()
                .AddXmlDataContractSerializerFormatters();

    services.AddDbContext<BikeStoresContext>();

    // JWT Token
    var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("this-is-my-jwt-security-key"));

    var tokenValidationParameters = new TokenValidationParameters()
            {
                IssuerSigningKey = signingKey,
                ValidateIssuer = false,
                ValidateAudience = true,
                ClockSkew = TimeSpan.Zero
            };

    services.AddAuthentication(x => x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(jwt =>
                {
                    jwt.TokenValidationParameters = tokenValidationParameters;
                });

    services.AddIdentity<IdentityUser, IdentityRole>()
       .AddEntityFrameworkStores<BikeStoresContext>()
       .AddDefaultTokenProviders();

    services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "BikeStoreAPI", Version = "v1" });
            });
}

这是我从 Accounts 控制器的登录操作方法生成 JWT 令牌的代码:

var user = await userManager.FindByEmailAsync(model.UserEmail);
var roles = await userManager.GetRolesAsync(user);

IdentityOptions identityOptions = new IdentityOptions();
var claims = new Claim[]
                 {
                     new Claim("Lid", "123456789"),
                     new Claim(identityOptions.ClaimsIdentity.UserIdClaimType, user.Id),
                     new Claim(identityOptions.ClaimsIdentity.UserNameClaimType, user.UserName),
                     new Claim(identityOptions.ClaimsIdentity.RoleClaimType, roles[0]),
                     new Claim(identityOptions.ClaimsIdentity.EmailClaimType, user.Email)
                 };

var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("this-is-my-jwt-security-key"));
var signingCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);

var jwt = new JwtSecurityToken(claims: claims, 
                    signingCredentials: signingCredentials, 
                    expires: DateTime.Now.AddMinutes(30));

return Ok(new
          {
              userName = model.UserEmail,
              role = roles[0],
              token = new JwtSecurityTokenHandler().WriteToken(jwt)
          });

生成了 JWT 令牌,但是当我使用 JWT 令牌访问其他 API 时,出现此错误。

WWW-Authenticate: Bearer error="invalid_token", error_description="观众 'empty' 无效"

我不知道我在这段代码中哪里出错了。是否需要更改?

提琴手截图:

【问题讨论】:

    标签: api asp.net-core jwt asp.net-core-webapi bearer-token


    【解决方案1】:

    tokenValidationParameters 中您设置了ValidateAudience = true,这意味着将检查aud-claim。但是您从不为 ValidAudience 设置值,也不要在令牌中添加 aud-claim。

    您可以通过设置关闭检查

    ValidateAudience = false
    

    或添加ValidAudiencelike 例如:

    ValidAudience = "your audience"
    

    并添加aud-claim :

    new Claim(JwtRegisteredClaimNames.Aud  = "your audience")
    

    【讨论】:

      猜你喜欢
      • 2016-09-24
      • 1970-01-01
      • 2021-04-20
      • 2019-03-19
      • 2020-08-22
      • 2021-04-13
      • 2023-03-19
      • 2018-03-30
      • 2020-09-04
      相关资源
      最近更新 更多