向JWT令牌验证添加自定义函数

时间:2019-01-10 07:08:37

标签: c# authentication asp.net-core jwt

我正在使用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.

有什么想法为什么会这样?否则,还有其他机制可以实现这个目标吗?谁可以帮我这个事?

谢谢。

2 个答案:

答案 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);

您可以参考this blog for custom implementation.

答案 1 :(得分:0)

您是否已经在依赖注入容器中注册了CustomJwtBearerEvents类?您可以这样做:

services.AddTransient<CustomJwtBearerEvents>();

之所以需要这样做,是因为ASP.NET Core身份验证处理程序会尝试从容器实例化自定义类型,如您所见in the code on GitHub

此外,如果CustomJwtBearerEvents类具有构造函数依赖项,则这些依赖项也需要在DI容器中注册。