我正在使用ASP.NET Core开发一个项目,该项目使用JWT令牌对用户进行身份验证。
我在JWTBearerDefaults
文件中配置了Startup.cs
,如下所示:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "some.issuer",
ValidAudience = "some.issuer",
ClockSkew = TimeSpan.Zero,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(Configuration["SecurityKey"])),
};
options.EventsType = typeof(CustomJwtBearerEvents);
});
我的要求是,每当收到API调用时,我都应该能够获取令牌并进行一些验证。对于我的API控制器中的每个方法,我可以检查令牌并执行验证,但是我希望从一个地方调用该验证。因此,为此,我在顶部代码上添加了options.EventsType
行。
但是问题是,一旦我添加这一行,所有API调用都会失败,因为服务器会引发500 internal server error
和一个CORS policy
错误。但是,如果没有这一行,一切都会很好。
这是我在客户端浏览器中遇到的错误:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Access to XMLHttpRequest at 'http://localhost:58402/api/User/GetAllDurations' from origin 'http://localhost:56040' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
有什么想法为什么会这样?否则,还有其他机制可以实现这个目标吗?谁可以帮我这个事?
谢谢。
答案 0 :(得分:1)
您可以通过实现ISecurityTokenValidator接口来做到这一点。
public class MySecurityTokenValidator : ISecurityTokenValidator
{
public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters, out SecurityToken validatedToken)
{
//// Perform your custom validation here.
}
}
在“启动”中,您将必须按以下方式配置此新逻辑:
var bearerOptions = new JwtBearerOptions();
bearerOptions.SecurityTokenValidators.Add(new MySecurityTokenValidator(app.ApplicationServices, Encoding.UTF8.GetBytes("SecurityKey1234567890")));
app.UseJwtBearerAuthentication(bearerOptions);
答案 1 :(得分:0)
您是否已经在依赖注入容器中注册了CustomJwtBearerEvents
类?您可以这样做:
services.AddTransient<CustomJwtBearerEvents>();
之所以需要这样做,是因为ASP.NET Core身份验证处理程序会尝试从容器实例化自定义类型,如您所见in the code on GitHub。
此外,如果CustomJwtBearerEvents
类具有构造函数依赖项,则这些依赖项也需要在DI容器中注册。