Skip to main content
 首页 » 编程设计

c#之Action 过滤器未被调用 WebAPI/.net Core

2024年02月04日29zhujiabin

我有一个用 .NETCore 编写的 Web API 应用程序,我只想使用操作过滤器拦截请求,然后验证来自 header 中的 JWT token 。我写了一个如下所示的 ActionFilter:

using Microsoft.AspNetCore.Mvc.Filters; 
using Newtonsoft.Json; 
 
namespace Applciation.ActionFilters 
{ 
    public class AuthorizeJWT: ActionFilterAttribute, IActionFilter 
    { 
        void IActionFilter.OnActionExecuting(ActionExecutingContext context) 
        { 
            var jwt = context.HttpContext.Request.Headers["JWT"]; 
 
            try 
            { 
                var json = new JwtBuilder() 
                    .WithSecret(File.ReadLines("").ToList().First()) 
                    .MustVerifySignature() 
                    .Decode(jwt);                     
 
                var tokenDetails = JsonConvert.DeserializeObject<dynamic>(json); 
            } 
            catch (TokenExpiredException) 
            { 
                throw new Exception("Token is expired"); 
            } 
            catch (SignatureVerificationException) 
            { 
                throw new Exception("Token signature invalid"); 
            } 
            catch(Exception ex) 
            { 
              throw new Exception("Token has been tempered with"); 
            } 
        } 
    } 
} 

现在,我在服务配置中添加了操作过滤器,如下所示:

services.AddScoped<AuthorizeJWT>();

并像下面这样装饰我的 Controller :

 [AuthorizeJWT]             
    public virtual async Task<IActionResult> Ceate([FromBody]CreateDto,createDto) 
{ 
   //method body 
} 

但出于某种原因,我的 Action 过滤器没有被调用。配置中是否缺少任何内容?

请您参考如下方法:

ActionFilter 的定义不正确。您只需派生自 ActionFilterAttribute 类而不是接口(interface) IActionFilter,因为 ActionFilterAttribute 类已经实现了该接口(interface)。

如果您从继承中删除接口(interface),然后更改您的 OnActionExecuting 方法定义以覆盖基类实现,那么一切都会按预期工作:

using Microsoft.AspNetCore.Mvc.Filters; 
using Newtonsoft.Json; 
 
namespace Applciation.ActionFilters 
{ 
    public class AuthorizeJWT: ActionFilterAttribute 
    { 
        public override void OnActionExecuting(ActionExecutingContext context) 
        { 
            var jwt = context.HttpContext.Request.Headers["JWT"]; 
 
            try 
            { 
                var json = new JwtBuilder() 
                    .WithSecret(File.ReadLines("").ToList().First()) 
                    .MustVerifySignature() 
                    .Decode(jwt);                     
 
                var tokenDetails = JsonConvert.DeserializeObject<dynamic>(json); 
            } 
            catch (TokenExpiredException) 
            { 
                throw new Exception("Token is expired"); 
            } 
            catch (SignatureVerificationException) 
            { 
                throw new Exception("Token signature invalid"); 
            } 
            catch(Exception ex) 
            { 
              throw new Exception("Token has been tempered with"); 
            } 
        } 
    } 
}