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

给WSS3.0增加用户与IP绑定功能

公司用WSS3.0做内部协同,但是由于很多分公司在外地,所以协同网站必须在公网上,为了提高安全性和更好的分区域管理,所以要给WSS增加一个用户于IP绑定的功能,这个任务光荣地落到我的头上,结果查遍Google,Baidu无果,只好自力更生。想到的第一个方法是做一个WebPart,在WebPart检测登录的用户名,然后与数据库里的绑定表作对比。不过转念一想WebPart需要部署且要加了的页面才能起作用,整个网站集几十个站点,累也能累死。最后决定自己写一个HttpModule加上去,然后在AuthorizeRequest 事件里来验证。至于验证的过程到是很简单,只需要在数据库里比对一下就行了。
由于采用的Form认证,所以在aspnetdb数据库里增加一个绑定表,就两个列,UserAccount和IpAddr,因为不存在范围之类的所以直接用字符串的形式存储IP。
HttpModule很好写,为了避免每次都读取数据库,在第一次验证成功就生成Cookie,之后检测到Cookie就不再验证了。之前想过用Cache,不过Cache和Application一个级别的,用Session又太麻烦,于是用Cookie,最后代码如下:

 1       public   class  UserProvider:IHttpModule
 2      {
 3 
 4           private  HttpApplication ctx;
 5           private  String User;
 6           #region  IHttpModule 成员
 7 
 8           public   void  Dispose()
 9          {
10              ctx  =   null ;
11               // throw new Exception("The method or operation is not implemented.");
12          }
13 
14           public   void  Init(HttpApplication context)
15          {
16              ctx  =  context;
17              context.AuthorizeRequest  +=   new  EventHandler(context_AuthorizeRequest);
18 
19          }
20 
21           void  context_AuthorizeRequest( object  sender, EventArgs e)
22          {
23               try
24              {
25                   User  =  ctx.User.Identity.Name.ToLower();
26                    if  (User  !=   null   &&  User.Length  >   1 )
27                   {
28                        if  (ctx.Context.Request.Cookies[ " AuthIP " ] ==   null )
29                       {
30                           SqlConnection conn  =   new  SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings[ " LocalSqlServer " ].ConnectionString);
31                            string  IP  =   " 0.0.0.0 " ;
32                            string  UIP  =   "" ;
33                            using  (conn)
34                           {
35                               conn.Open();
36                               SqlCommand cmd  =   new  SqlCommand( " SELECT [UserAccount],[IPAddr] FROM [aspnetdb].[dbo].[IPLock] WHERE [UserAccount] = @P " , conn);
37                               cmd.Parameters.Add( " @P " , SqlDbType.VarChar,  50 ).Value  =  User;
38                               SqlDataReader sd  =  cmd.ExecuteReader();
39                                if  (sd.Read())
40                               {
41                                   IP  =  sd[ " IpAddr " ].ToString();
42                               }
43                               conn.Close();
44 
45                               UIP  =  ctx.Request.UserHostAddress;
46                                if  ( ! IP.Equals( " 0.0.0.0 " ))
47                               {
48                                    if  ( ! IP.Equals(UIP))
49                                   {
50                                        throw   new  Exception( " IP地址被禁止 "   +  User  +   " : "   +  IP);
51                                   }
52                               }
53                               ctx.Response.Cookies.Add( new  HttpCookie( " AuthIP " ));
54                               ctx.Response.Cookies[ " AuthIP " ].Value  =   " OK " ;
55                               ctx.Response.Cookies[ " AuthIP " ].Expires  =  DateTime.Now.AddDays( 1 );
56                           }
57                       }
58                   }
59              }
60               catch  (Exception ex)
61              {
62                   throw  ex;
63              }
64              
65          }
66 
67           #endregion
68      }

不过在Web.Config里加载上这个模块后直接报错了。显示 SqlClientPermission 的权限有问题,看来在这里访问数据库还是有问题,WSS应该对代码的安全性做了限制,查了查Web.Config.看到:

1       < securityPolicy >
2         < trustLevel name = " WSS_Medium "  policyFile = " C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_mediumtrust.config "   />
3         < trustLevel name = " WSS_Minimal "  policyFile = " C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_minimaltrust.config "   />
4         < trustLevel name = " WSS_Custom "  policyFile = " C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\wss_custom_wss_minimaltrust.config "   />
5       </ securityPolicy >

看来是在这里设置的了。找到<trust level="WSS_Custom" originUrl="" /> 发现当前WSS使用的WSS_Custom这个配置,于是就到C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\config\ 找到Wss_Custom_wss_minimaltrust.config文件

看了下发现里面确实没有关于Sqlclient的配置,本来想就地添加,不过转念一想自己动手怕将来要修改的地方太多太杂,于是继续看了下另外两个config文件,最后在wss_mediumtrust.config 里找到了SqlClint相关的配置,于是最后将trust节点改成<trust level="WSS_Medium" originUrl="" />

打开页面看看,OK,搞定收工。

[本代码乃Demo,与公司内部使用的代码与逻辑均不相同,特此声明]

相关文章:

  • CrystalReport水晶报表
  • 网站SEO方案
  • 关于业务规则层、业务实体层、业务外观层、模型层的作用很不清楚,殷切期望解答...
  • 交换机和路由器的区别
  • 如何在Windows server 2003上安装和设置Citrix MetaFrame XP FR3
  • 【转贴】DXUT 框架入门 2
  • Rawether .NET
  • 我的部分设计作品(DIV+CSS)截屏
  • Ghost系统含漏洞藏杀机 伺机破坏计算机
  • B-BOY十大守则
  • 项目最难的阶段-解决方案的确认
  • ROR seo系列 | 站点地图
  • ORACLE的封锁机制
  • 给你快乐的7个理由
  • [摘]广义企业级PDM系统下的PPM(工艺规划管理)
  • gulp 教程
  • interface和setter,getter
  • Invalidate和postInvalidate的区别
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript中的对象个人分享
  • Kibana配置logstash,报表一体化
  • leetcode386. Lexicographical Numbers
  • socket.io+express实现聊天室的思考(三)
  • Terraform入门 - 3. 变更基础设施
  • Vue ES6 Jade Scss Webpack Gulp
  • VuePress 静态网站生成
  • 测试开发系类之接口自动化测试
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 欢迎参加第二届中国游戏开发者大会
  • 排序(1):冒泡排序
  • 如何使用 JavaScript 解析 URL
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 智能合约开发环境搭建及Hello World合约
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #if 1...#endif
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (31)对象的克隆
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (八)Spring源码解析:Spring MVC
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (免费领源码)Java#Springboot#mysql农产品销售管理系统47627-计算机毕业设计项目选题推荐
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (一)认识微服务
  • .dwp和.webpart的区别
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET delegate 委托 、 Event 事件
  • .net 使用ajax控件后如何调用前端脚本
  • .NET命令行(CLI)常用命令