Action过滤器

1.OnActionExecuting 
在Action方法调用前使用,使用场景:如何验证登录等。

2.OnActionExecuted
在Action方法调用后,result方法调用前执行,使用场景:异常处理。

3.OnResultExecuting
在result执行前发生(在view 呈现前),使用场景:设置客户端缓存,服务器端压缩.

4.OnResultExecuted
在result执行后发生,使用场景:异常处理,页面尾部输出调试信息。

 

我们在访问接口时有时需要在Hearder头部加上Authorization认证,具体操作如下

WebApiConfig类中Register方法添加认证控制,然后重写OnActionExecuting 方法

 

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
using System.Web.Http.Filters;

namespace WebApplication2
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API 配置和服务

            // Web API 路由
            config.MapHttpAttributeRoutes();
            config.Filters.Add(new ApiPermissionFilter());  //注册全局API Action过滤器
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );          
        }

       
    }
    public class ApiPermissionFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            var anonymousAction = actionContext.ActionDescriptor.GetCustomAttributes<AllowAnonymousAttribute>();
            if (!anonymousAction.Any())
            {
                var  status = GetCurUserInfo(actionContext.Request);
                if (!status)
                {
                    actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, new HttpError("error"));
                    base.OnActionExecuting(actionContext);
                }
            }
        }

        public static bool  GetCurUserInfo(HttpRequestMessage Request)
        {
            var status = false;
            var Authorization = Request.Headers.Authorization;
            if (Authorization != null && Authorization.Scheme == "Basic")
            {
                //可以针对token做一些其他判断
                status = true;
            }
            return status;
        }
        }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;

namespace WebApplication2.Controllers
{
    public class TestController : ApiController
    {
        [HttpGet,HttpPost]
        public void GetValue(Message value)
        {
            //{"name":"1","id":"2"}
        }

        [HttpGet]
        [AllowAnonymous]//加上这个可忽略token认证
        public void GetValue2(string value)
        {
           
        }

    }

    public class Message
    {
        public string name { get; set; }
        public string id { get; set; }
    }
}

 https://www.cnblogs.com/mr-hero/p/5919979.html

posted on 2019-12-31 09:46  红磨坊后的白桦树  阅读(362)  评论(0编辑  收藏  举报