当前位置: 代码迷 >> VC/MFC >> 在.Net MVC构造API接口中判断http头信息实现公共的权限验证过滤器示例
  详细解决方案

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

热度:183   发布时间:2016-05-02 03:19:26.0
在.Net MVC结构API接口中判断http头信息实现公共的权限验证过滤器示例

//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] 标签,就能实现权限验证,当然,如果不同的方法 ,也可以使用不同的过虑器~自己可以随便定义。

  相关解决方案