阅读文章

雕虫小技--授权控件

[日期:2008-04-23] 来源:  作者: [字体: ]

    
  开篇语
  
   每个系统都有她的授权模块,很早就想把"授权模块"抽象出来,省得每次都做一些不必要的"机械运动":)再说,这样也可以降低系统的"偶合度".
  很早其实就想到了,可以利用IHttpModule接口的验证和授权两个事件,来做点什么...
  但是,后来发现在验证和授权两个事件中,压根不能使用Session,这怎么办了?放HttpApplication里吗?感觉不安全,就一值没有再想这个问题了...
  后来查了一通MSDN,发现AcquireRequestState事件中,Session对象已经构成了,哎,都怪我当时太懒了...
  那就把"授权过程"放在AcquireRequestState事件中吧.
  理论上,应该会比放在授权事件中要慢一点,但是没关系,慢就慢点,总比放在页面运行环境中,来得快些,安全些:)
  
  切入点
  
   在IHttpModule模块的AcquireRequestState事件中做"授权过程".
  
  效果图
  
  
  开始了
  步骤一(new一类库,实现IHttpModule接口)
  Code
  using System;
  using System.Collections.Generic;
  using System.Text;
  
  using System.Web;
  using System.Web.SessionState;
  using System.Web.Security;
  
  
  namespace HttpModule授权
  {
   class AuthorHttpModule : System.Web.IHttpModule//, IRequiresSessionState
   {
   IHttpModule 成员#region IHttpModule 成员
  
   public void Dispose()
   {
   }
  
   public void Init(HttpApplication context)
   {
   context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
   }
  
   void context_AcquireRequestState(object sender, EventArgs e)
   {
   HttpApplication application = (HttpApplication)sender;
  
   // 如果用户未登录,则无需检查模块授权。
   HttpRequest request = application.Request;
   if (!request.IsAuthenticated)
   return;
  
   if (application.Session["UserName"] == null)
   {
   FormsAuthentication.SignOut();
   return;
   }
   // 获取用户名和Url
   string userName = application.Session["UserName"].ToString();
   string url = application.Request.Url.ToString();
  
   string strFileName = url.Substring(url.LastIndexOf('/')+1).Trim();
   string strExeName = strFileName.Substring(strFileName.LastIndexOf('.') + 1).Trim();
  
   // 授权过程
   if (!Validator.CanUseModule(strFileName, userName))
   {
   application.Response.Write(string.Format("sorry ,you can not acc {0} res",strFileName));
   application.CompleteRequest();
   }
  
   }
  
   #endregion
   }
  
  
  }
  
  步骤二(再new一普通类,具体的授权过程看情况而定)
  
  
  Code
  using System;
  using System.Collections.Generic;
  using System.Text;
  
  namespace HttpModule授权
  {
   public class Validator
   {
   /**//// <summary>
   /// 检查用户是否被授权使用模块。
   /// 这里只是模拟授权,在这里用户名为wmj被授权,其他都不行
   /// </summary>
   /// <param name="userName"></param>
   /// <param name="url"></param>
   /// <returns></returns>
   public static bool CanUseModule(string url,string name)
   {
  
   if (userName == "wmj" || url=="index.ASPx")
   return true;
   else
   return false;
   }
   }
  }
  
  步骤三
  使用方法(new一站点,在System.web节点下增加httpModules节点)
  
  
  Code
  <httpModules>
  
   <add name="HttpModuleName" type="HttpModule授权.AuthorHttpModule"/>
   </httpModules>
   到此,配置完成
  
  需要注意的地方
   1.虽然在授权没有通过的时候,调用了application.CompleteRequest()方法,来终结http管线中的所有事件.
  但是,http管线中的最后三个事件仍然会执行,并不回终结一切事件.
  请想一想,如果整个http管线中的事件都不执行了,那我们怎么会看到,"没有授权的提示呢"?
  
   2.千万不要在http管线的事件中有SQL查询语句,如果是这样,我宁愿不用这玩意(如果是这样,每次请求都要build database Connection,痛苦.)
  
   4.站点最好设置成Form验证,(这一部分我省了)
  
   3.虽然这是一个好想法,但是要把她实现得更加"完美",还是有一定难度的.
  
  结尾
  
    


阅读:
录入:blue1000

评论 】 【 推荐 】 【 打印
上一篇:一步一步学习sqlserver BI--数据仓库设计
下一篇:【C#食谱】【杭帮菜】菜单1:写一个TCP服务端 问题:
相关文章      
本文评论
发表评论


点评: 字数
姓名:

  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款