WebApi过滤器:AuthorizationFilterAttribute -> ActionFilterAttribute -> ExceptionFilterAttribute

一、权限认证过滤器:

public class AuthFilterAttribute : AuthorizationFilterAttribute
    {
        public override void OnAuthorization(HttpActionContext actionContext)
        {
            //如果用户方位的Action带有AllowAnonymousAttribute,则不进行授权验证
            if (actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>().Any())
            {
                return;
            }

            var dicHeader = actionContext.Request.Headers.ToDictionary(r => r.Key, r => r.Value);

            //var verifyResult = actionContext.Request.Headers.Authorization != null && actionContext.Request.Headers.Authorization.Scheme == "123456";
            var verifyResult = dicHeader.Any(r => r.Key == "Authorization" && r.Value != null && r.Value.Contains("123456"));

            if (!verifyResult)
            {
                //如果验证不通过,则返回401错误,并且Body中写入错误原因
                //actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("Token 不正确"));
                actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "请登录");
            }
        }
    }

二、在请求前后执行:

public class MyActionAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// 在Action方法运行之前调用
        /// </summary>
        /// <param name="actionContext"></param>
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            //2.获取控制器作用的Controller和action的名字
            string controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
            string actionName = actionContext.ActionDescriptor.ActionName;
            //HttpContext.Current.Response.Write("行为过滤器OnActionExecuting作用于" + controllerName + "控制器下的" + actionName + "方法运行之前");
            //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
            base.OnActionExecuting(actionContext);
        }

        /// <summary>
        /// 在Action方法运行之后调用
        /// </summary>
        /// <param name="actionExecutedContext"></param>
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //2.获取控制器作用的Controller和action的名字
            string controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName.ToLower();
            string actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName.ToLower();
            //HttpContext.Current.Response.Write("行为过滤器OnActionExecuted作用于" + controllerName + "控制器下的" + actionName + "方法运行之后");
            //1.如果保留如下代码,则会运行.net framework定义好的行为验证,如果希望自定义行为验证,则删除如下代码
            base.OnActionExecuted(actionExecutedContext);
        }
    }

三、异常处理过滤器:

public class MyExceptionAttribute : ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Exception is LingbugException)
            {
                //如果截获异常为我们自定义,可以处理的异常则通过我们自己的规则处理
                //自定义异常,如校验不通过等手动抛出的异常
                actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.BadRequest, new { Message = actionExecutedContext.Exception.Message });
            }
            else
            {
                //如果截获异常是我没无法预料的异常,则将通用的返回信息返回给用户,避免泄露过多信息,也便于用户处理
                //系统异常
                actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.InternalServerError, new { Message = "服务器被外星人拐跑了!" });
            }
        }
    }

Ending......

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值