.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);
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章