過程
通過 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);
}
}