.NetCore3 使用 ActionFilterAttribute 来实现身份验证过滤器

过程

通过 Header传递我们的认证信息,然后通过实现 ActionFilterAttributes的方法来获取到 Header中的认证信息,经过业务验证,可有通过与不通过,不通过则直接指定上下文 Result,并且 return,通过则把请求往后继续转发

ActionFilterAttribute

官方解释
命名空间:namespace Microsoft.AspNetCore.Mvc.Filters
这个抽象类有如下虚方法:

  • OnActionExecuted:Action 执行之后执行
  • OnActionExecuting:Action 执行之前执行
  • OnActionExecutionAsync:Action 执行之前执行(异步)
  • OnResultExecuted:Result 执行之后执行
  • OnResultExecuting:Result 执行之前执行
  • OnResultExecutionAsync:Result 执行之前执行(异步)

实现

我们这里需要在 Action 其他动作执行之前执行,所以我们实现 OnActionExecuting

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
    public class AuthFilterAttribute: ActionFilterAttribute
    {
        private readonly string AuthHeaderKey;

        public string ResultMethodName { get; set; }

        public Type ResultMethodDelcaringType { get; set; }

        public AuthFilterAttribute(string authHeaderKey)
        {
            AuthHeaderKey = authHeaderKey;
            ResultMethodDelcaringType = typeof(AuthDefaultConst);
        }

        public override void OnActionExecuting(ActionExecutingContext context)
        {
            var authResult = true;
            if (!string.IsNullOrEmpty(AuthHeaderKey))
            {
                var authInHeader = context?.HttpContext?.Request?.Headers[AuthHeaderKey];

                if (authInHeader.HasValue && authInHeader.Value.Count > 0)
                {
                    int headerValue;
                    if (int.TryParse(authInHeader.Value[0], out headerValue))
                    {
                        var authType = (LoginAuth)Enum.Parse(typeof(LoginAuth), 
                                                                    (headerValue >= 0 ? headerValue : 0).ToString());

                        authResult = authType != LoginAuth.Illegal;
                    }
                }
            }

            if (!authResult)
            {
                //auth field,return default value
                object result = null;
                if (!string.IsNullOrEmpty(ResultMethodName))
                {
                    var method = ResultMethodDelcaringType.GetMethod(ResultMethodName);
                    if (method != null)
                    {
                        result = method.Invoke(null, null);
                    }
                }
                context.Result = new JsonResult(result);
                return;
            }

            //auth success,do other things
            base.OnActionExecuting(context);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值