如何在每个ASP.NET WebApi请求上对JWT令牌应用自定义验证?

时间:2016-02-23 19:41:46

标签: c# asp.net-web-api jwt

使用不记名令牌验证网络API呼叫时是否可以为每个请求添加自定义验证?

我正在使用以下配置,应用程序已经正确验证了JWT令牌。

app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions
{
    AuthenticationType = "jwt",
    TokenEndpointPath = new PathString("/api/token"),
    AccessTokenFormat = new CustomJwtFormat(),
    Provider = new CustomOAuthProvider(),
});

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    AllowedAudiences = new[] { "all" },
    IssuerSecurityTokenProviders = new[] { new SymmetricKeyIssuerSecurityTokenProvider(Config.JWT_Issuer, Config.JWT_Key) },,

});

现在,由于令牌设置为永不过期,我想为使用不记名令牌的每个请求添加一个额外的自定义验证步骤,因此我可以根据请求验证一些其他信息,并在需要时拒绝访问。

为每个请求添加此验证的正确位置在哪里?

3 个答案:

答案 0 :(得分:18)

添加其他逻辑以验证或验证传入令牌:

1)使用身份验证提供程序

  1. 编写自定义提供程序继承自OAuthBearerAuthenticationProvider或实现IOAuthBearerAuthenticationProvider

  2. 在您的自定义身份验证提供程序中,覆盖/实施ValidateIdentity(...)和/或RequestToken(...)以检查每个请求的传入令牌

  3. 通过将自定义提供商分配到JwtBearerAuthenticationOptions.Provider属性

  4. 来使用自定义提供商

    示例:

    app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
    {
        // ... other properties here
        Provider = new MyCustomTokenAuthenticationProvider()
        // ... other properties here
    });
    

    2)使用令牌处理程序

    1. 编写自定义令牌处理程序继承自JwtSecurityTokenHandler

    2. 覆盖您想要扩展的任何相关方法(有很多!)

    3. 通过将自定义令牌处理程序分配给JwtBearerAuthenticationOptions.TokenHandler属性

    4. 来使用它

      示例:

      app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
      {
          // ... other properties here
          TokenHandler = new MyCustomTokenHandler()
          // ... other properties here
      });
      

答案 1 :(得分:1)

在.Net Core上,您可以将其添加到JwtBearerOptions

options.Events = new JwtBearerEvents
{
    OnTokenValidated = AdditionalValidation
};

您的Validation函数如下所示:

private static Task AdditionalValidation(TokenValidatedContext context)
{
    if ( /* any validation */ ) 
    {
        context.Fail("Failed additional validation");
    }

    return Task.CompletedTask;
}

好消息是context将包括您所需要的所有内容,JWT令牌,HttpContextClaimsPrincipal等。

答案 2 :(得分:0)

我要说的最好方法是编写自定义属性。您需要继承AuthorizeAttribute类和覆盖AuthorizeCore方法,在那里您可以添加自定义验证。

完成后,只需用它来装饰你的控制器或方法。

https://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute(v=vs.118).aspx

实施例:

public class MyCustomAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        // your validation here
    }
}

用法考试:

[MyCustom]
public ActionResult MyAction()
{
    return View();
}