无法验证 JWT 令牌 .Net Core 6

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

我正在尝试验证 JWT 令牌,但仍然收到 401 错误。请在下面找到我的代码:-

程序.cs

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "JWTToken_Auth_Api", Version = "v1" });
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = @"JWT Authorization header using the Bearer scheme. \r\n\r\n 
                      Enter 'Bearer' [space] and then your token in the text input below.
                      \r\n\r\nExample: 'Bearer 12345abcdef'",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        BearerFormat = "JWT",
        Scheme = "bearer"
    });

    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
      {
        {
          new OpenApiSecurityScheme
          {
            Reference = new OpenApiReference
              {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            }
          },
            new string[]{ }
          }
       });
});

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(options =>
{
    options.RequireHttpsMetadata = false;
    options.SaveToken = true;
    options.IncludeErrorDetails = true;
    options.TokenValidationParameters = new TokenValidationParameters()
    {
        ValidateIssuer = true,
        ValidateAudience = true,
        ValidateLifetime = true,
        ValidateIssuerSigningKey = false,
        ValidAudience = builder.Configuration["Jwt:Audience"],
        ValidIssuer = builder.Configuration["Jwt:Issuer"],
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
    };
});

在控制器内部我创建了一个函数来获取令牌值。如下:-

 [NonAction]
    public string GetToken(LoginUser loginUser)
    {
        var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, _configuration["Jwt:Subject"]),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
            new Claim("UserId", loginUser.UserLogin),
            new Claim("Name", loginUser.FirstName +" "+ loginUser.LastName),
            new Claim("Email", loginUser.Email)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        //            var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var token = new JwtSecurityToken(
            _configuration["Jwt:Issuer"],
            _configuration["Jwt:Audience"],
            claims,
            expires: DateTime.UtcNow.AddMinutes(10),
            signingCredentials: signIn);

        string Token = new JwtSecurityTokenHandler().WriteToken(token);
        return Token;
    }

登录并获取令牌值后,当我尝试访问其他 API 服务时,我得到以下屏幕截图:-

请告诉我哪里错了。

.net-core jwt asp.net-core-webapi
1个回答
0
投票

尝试使用 SecurityTokenDescriptor 类来创建安全令牌

包含一些用于创建安全令牌的信息。

尝试对您的代码进行一些修改,例如:

 var claims = new[]
        {
            new Claim(JwtRegisteredClaimNames.Sub, _configuration["Jwt:Subject"]),
            new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
            new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString()),
            new Claim("UserId", loginUser.UserLogin),
            new Claim("Name", loginUser.FirstName +" "+ loginUser.LastName),
            new Claim("Email", loginUser.Email)
        };

        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        //            var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
        var signIn = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
 var tokenDescriptor1 = new SecurityTokenDescriptor {
     Issuer =  _configuration["Jwt:Issuer"],,
     Audience =_configuration["Jwt:Audience"],
     Subject = new ClaimsIdentity(claims),
     Expires= DateTime.UtcNow.AddMinutes(10),
     SigningCredentials= signIn };

 var tokenObject1 = new JwtSecurityTokenHandler().CreateToken(tokenDescriptor1);
 string Token = new JwtSecurityTokenHandler().WriteToken(tokenObject1);
 return Token;

结果:

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