JWT 鉴权的问题,一直返回401 Console.Write();打印出来为invalid_token,但是我验证这个Token好像是没问题的,然而我通过swagger测试不行,
麻烦大手子们看下是我哪里配置有问题吗
下面贴代码
///
/// 获取 Token
///
/// 用户名
/// 密码
///
public string GetToken(string userName, string password)
{
#region 有效载荷
var claims = new[] {
new Claim(ClaimTypes.Name, userName),
new Claim("NickName",userName),
new Claim(ClaimTypes.Role,"Administrator"),
new Claim("Role","Assient"),
};
#endregion
SymmetricSecurityKey key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_option.CurrentValue.SecurityKey!));
SigningCredentials signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
JwtSecurityToken token = new JwtSecurityToken(
issuer: _option.CurrentValue.Issuer!,
audience: _option.CurrentValue.Audience!,
claims: claims,
expires: DateTime.Now.AddMinutes(60),
notBefore: DateTime.Now,
signingCredentials: signingCredentials);
string returnToken = new JwtSecurityTokenHandler().WriteToken(token);
return returnToken;
}
#region JWT配置鉴权
JWTTokenOption tokenOption = new JWTTokenOption();
builder.Configuration.Bind("JWTTokenOption", tokenOption);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(option =>
{
option.TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidAudience = tokenOption.Audience,
ValidIssuer = tokenOption.Issuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(tokenOption.SecurityKey!))
};
option.Events = new JwtBearerEvents
{
//此处为权限验证失败后触发的事件
OnChallenge = context =>
{
Console.Write(context.Error);
context.HandleResponse();
//自定义自己想要返回的数据结果
var payload = "{\"Success\":false,\"Msg\":\"很抱歉,您无权访问该接口\",\"StatusCode\":401}";
context.Response.ContentType = "application/json";
context.Response.StatusCode = 200;
//输出Json数据结果
context.Response.WriteAsync(payload);
return Task.FromResult(0);
}
};
});
#endregion
//以上信息都是读取的appsettin的数据,调试都是有值的
"JWTTokenOption": {
"Audience": "22333",
"Issuer": "22333",
"SecurityKey": "12333456677655ffrrffff"
}
您的代码看起来基本没问题,但有几个可能的原因需要检查:
您是否已经将 JWT 添加到了应用程序的管道中?在您的 Configure 方法中,应添加以下行:
app.UseAuthentication();
您是否已经在请求的头部中设置了 Authorization?确保在调用受保护的 API 时,您已经在请求头部中设置了带有 JWT 的 Authorization。例如,您的请求头部可能如下所示:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
如果您正在使用 Swagger 进行测试,确保您已正确配置了 Swagger。在您的 ConfigureServices 方法中,应包含以下行:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
// Add JWT Authentication to swagger
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT Authorization header using the Bearer scheme. Example: "Authorization: Bearer {token}"",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.Http,
Scheme = "bearer"
});
c.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[] { }
}
});
});
如果您使用的是 IdentityServer4 来保护您的 API,您需要检查授权服务器是否正确配置并正在运行。在这种情况下,您的 ConfigureServices 方法可能看起来像这样:
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "https://my-identity-server.com";
options.RequireHttpsMetadata = true;
options.ApiName = "my-api";
});
如果这些都没有解决您的问题,请检查您的请求头,确保您正在使用正确的 JWT。如果您的代码仍然无法工作,请提供更多信息,例如您正在使用的框架和技术,以及您的请求头和响应详细信息。