我正在尝试验证 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 服务时,我得到以下屏幕截图:-
请告诉我哪里错了。
尝试使用 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;