当前位置: 首页 > news >正文

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

相关文章:

  • JAVA生成二维码(zxing)
  • 【源代码】LinkedHashMap源代码剖析
  • Codeforces Gym 100015C City Driving 离线LCA
  • C#中timer类的用法
  • JavaScript基础:数据类型的中的那些少见多怪
  • 负数的二进制表示
  • FreeRADIUS+DaloRADIUS实现PPTP ***高级用户控制+流量控制
  • 利用angular结合translate为项目实现国际化
  • ADT Example
  • 浮现式设计
  • Office365管理员操作手册-1
  • 【设计模式】抽象工厂模式
  • oracle——06表查询中需要注意的一些问题
  • 佛山Uber优步司机奖励政策(1月25日~1月31日)
  • 携程一万亿交易额的市场逻辑
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • css的样式优先级
  • ES6系列(二)变量的解构赋值
  • express + mock 让前后台并行开发
  • gitlab-ci配置详解(一)
  • JAVA多线程机制解析-volatilesynchronized
  • JS笔记四:作用域、变量(函数)提升
  • PhantomJS 安装
  • php的插入排序,通过双层for循环
  • text-decoration与color属性
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 基于 Babel 的 npm 包最小化设置
  • 简单数学运算程序(不定期更新)
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • MyCAT水平分库
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​iOS安全加固方法及实现
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (06)Hive——正则表达式
  • (LeetCode 49)Anagrams
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (简单) HDU 2612 Find a way,BFS。
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • .Family_物联网
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .Net 4.0并行库实用性演练
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 使用配置文件
  • .Net接口调试与案例
  • .net知识和学习方法系列(二十一)CLR-枚举
  • @CacheInvalidate(name = “xxx“, key = “#results.![a+b]“,multi = true)是什么意思
  • @Responsebody与@RequestBody