在.Net MVC结构API接口中判断http头信息实现公共的权限验证过滤器示例

简介: //control   action public class TestController : ApiController{ [MyAuthFilter] public string test(string str) { return str.

//control   action 

public class TestController : ApiController
{
	[MyAuthFilter]
	public string test(string str)
	{
		return str.Trim();
	}
}


	//过虑器类
    public class MyAuthFilter : ActionFilterAttribute
    {
        const string SecurityKeyName = "MySecurityKey";//http头的name
        public object _EBACLS = new object();
        public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
        {
            if (EBPermission == "1")//判断权限
            {
                if (EBACLS == null)
                {
                    lock (_EBACLS)
                    {
                        EBACLS = SetEBACLSData();
                    }
                }
                bool isAuth = false;
                bool isPermission = false;
                EBSecurityData EBSecurityData = null;//自定义对象
                IEnumerable<string> lists;
                if (actionContext.Request.Headers.TryGetValues(SecurityKeyName, out lists))
                {
                    string securityKey = lists.FirstOrDefault();
                    LogUtility.WriteLog(SecurityKeyName + securityKey);//写日志文件
                    try
                    {
                        EBSecurityData = EBSecurityUtility.GetSecurityData(securityKey);//解密得到的加密串
                        LogUtility.WriteLog("EBSecurityData:" + (EBSecurityData != null ? EBSecurityData.ObjectToJson() : ""));
                    }
                    catch (Exception)
                    { }
                    if (EBSecurityData != null && EBSecurityData.Expire > DateTime.Now && EBSecurityData.ProviderId > 0)
                    {
                        GenericIdentity identity = new GenericIdentity(EBSecurityData.ProviderId.ToString(), "Forms");
                        GenericPrincipal principal = new GenericPrincipal(identity, new string[] { });
                        HttpContext.Current.User = principal;
                        isAuth = true;

                        string actionName = actionContext.ActionDescriptor.ActionName.ToLower();
                        string actionNo;
                        EBACLS.TryGetValue(actionName, out actionNo);
                        if (!string.IsNullOrWhiteSpace(EBSecurityData.Acl) && !string.IsNullOrWhiteSpace(actionNo))
                        {
                            string acl = string.Format(",{0},", EBSecurityData.Acl);
                            isPermission = acl.Contains("," + actionNo + ",");
                        }
                    }
                }

                if (!isAuth)
                {
                    throw new BusinessException("登录验证失败", 401);
                }
                else if (!isPermission)
                {
                    throw new BusinessException("未授权", 403);
                }
            }
        }

        public static Dictionary<string, string> EBACLS { get; set; }

        Dictionary<string, string> SetEBACLSData()
        {
            Dictionary<string, string> dic = new Dictionary<string, string>();
            dic.Add("getorderitemoperaterecords", "01");
            dic.Add("getorderitemchangedetail", "02");
            return dic;
        }
    }


http头请求示例:

User-Agent: Fiddler
Host: localhost
Content-Length: 478
Content-Type: text/json
MySecurityKey: roxnQNJLa0voulfXMcGugvhKJT1njtDV1Hmu67MbGPIU0UlEVmKXjXkPJ5d7dn1HdD%2BPDM%2Fsa9IJn36NksxQE1MdQ8Mqt1JqhvTTvQfG3zhrSFYgMQVAe3AuYcEN%2F9873lIjXXyuK%2FUQ75vJ3kH3bYIZykRmSvR4fPMbxNVWhVHuhO%2BdVJJQDpLS2Pihy1KbjffkcMNYBZJWdPu%2FLzYCIesaLh%2FDC85IOUi9OOdWzaPMjbvPXoBN7ahN%2Fj%2BkmWNJiYBxPPVO3IU%3D


拿到了 MySecurityKey 的值 ,想怎么处理就怎么处理,我这里只是一样示例,有效增加api安全系数。

如果哪个方法很重要,要使用权限,只要在上面加[ MyAuthFilter] 标签,就能实现权限验证,当然,如果不同的方法 ,也可以使用不同的过虑器~自己可以随便定义。

相关文章
|
17天前
|
Java API Spring
SpringBoot项目调用HTTP接口5种方式你了解多少?
SpringBoot项目调用HTTP接口5种方式你了解多少?
64 2
|
2月前
|
算法 API UED
基于Gin框架的HTTP接口限速实践
基于Gin框架的HTTP接口限速实践
27 0
|
2月前
|
JSON 搜索推荐 网络协议
玩转curl指令—测试简单的HTTP接口
玩转curl指令—测试简单的HTTP接口
51 0
|
3月前
|
DataWorks 大数据 API
DataWorks RunTriggerNode接口是只能调度 http触发器节点吗?
DataWorks RunTriggerNode接口是只能调度 http触发器节点吗?
137 1
|
2月前
|
Web App开发 存储 缓存
三、《图解HTTP》- 报文内的 HTTP信息
三、《图解HTTP》- 报文内的 HTTP信息
41 0
|
5月前
|
缓存 前端开发 API
手把手教你云相册项目简易开发day5 API服务搭建和权限框架
手把手教你云相册项目简易开发day5 API服务搭建和权限框架
74 0
|
4月前
|
XML JSON Java
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
Android App网络通信中通过okhttp调用HTTP接口讲解及实战(包括GET、表单格式POST、JSON格式POST 附源码)
143 0
|
28天前
|
JSON 前端开发 数据格式
糊涂工具类真是场景下请求http接口的案例
糊涂工具类真是场景下请求http接口的案例
21 0
|
29天前
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao
8 0