在ASP .NET Core中使用OpenIdConnect验证访问令牌时,有时可能会遇到“无效的JWT”错误。这种错误通常是由于访问令牌的签名验证失败或令牌已过期引起的。下面是一些解决方法的代码示例:
services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.Authority = "https://your-authority-url";
options.Audience = "your-api-resource";
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
ValidateAudience = true,
ValidateIssuer = true,
ValidIssuer = "your-valid-issuer",
ValidAudience = "your-valid-audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-signing-key"))
};
});
在上述代码中,options.Authority
指定了Identity Provider的URL,options.Audience
指定了API资源的名称。ValidIssuer
和ValidAudience
指定了有效的JWT签发者和受众,IssuerSigningKey
指定了用于验证签名的密钥。
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateLifetime = true,
LifetimeValidator = (DateTime? notBefore, DateTime? expires, SecurityToken securityToken, TokenValidationParameters validationParameters) =>
{
if (expires.HasValue && expires.Value < DateTime.UtcNow)
{
return false; // 令牌已过期
}
return true;
}
};
});
在上述代码中,ValidateLifetime
设置为true
以启用过期时间验证。LifetimeValidator
委托函数用于自定义过期时间的验证逻辑,这里检查了令牌的expires
是否小于当前时间。
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
ValidateLifetime = true,
RequireExpirationTime = true,
RequireAudience = true,
RequireSignedTokens = true,
ValidIssuer = "your-valid-issuer",
ValidAudience = "your-valid-audience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your-signing-key")),
NameClaimType = "name",
RoleClaimType = "role"
};
});
在上述代码中,NameClaimType
和RoleClaimType
指定了JWT中声明的名称和角色声明的名称,可以根据实际情况进行调整。
通过以上解决方法,您应该能够解决ASP .NET Core中OpenIdConnect访问令牌无效的JWT问题。请根据您的实际情况进行相应的调整和配置。