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