ASP.NET的HttpModule
创始人
2024-04-21 05:01:10
0

这段时间项目进入结束阶段,一直处于空闲状态,没事就把以前收集的一些代码研究了一下,发现ASP.NET真的是很强大,光一个web.config,我要真正透彻的了解它,还要花点功夫,刚刚稍微看了一下HttpModule, 做了个小程序,写下来,当作自己的学习笔记吧。
HttpModules实现了类似于ISAPI Filter的功能,在开发上,通常需要经过以下步骤:
1.编写一个类,实现IhttpModule接口
2.实现Init 方法,并且注册需要的方法
3.实现注册的方法
4.实现Dispose方法,如果需要手工为类做一些清除工作,可以添加Dispose方法的实现,但这不是必需的,通常可以不为Dispose方法添加任何代码。
5.在Web.config文件中,注册编写的类

关于Forms身份验证,网上的说明已经很多了,下面便开始做这个小小的角色控制程序。首先新建asp.net项目,并添加Login.aspx, Index1.aspx,index1.aspx, default.aspx等页面。添加一个存储用户信息的xml文件,在里面保存用户名,密码,用户角色等信息,类似这样:

  1.  
  2.  name="admin" password="admin" role="admin" /> 
  3.  name="user" password="user" role="user" /> 
  4.  

然后在web.config文件中的system.web节点中,按照下面的代码修改authentication节点,将身份验证方式设置为forms身份验证,并将登陆页面设置为

  1.  mode="Forms"> 
  2.  name="TestAuth" loginUrl="Login.aspx" protection="None" timeout="60" /> 
  3.  

另外再按如下方式增加如下节点控制用户对页面的访问的控制:

  1.  path="Index1.aspx"> 
  2.  
  3.  
  4.  users="?" roles="user"/> 
  5.  
  6.  
  7.  


接下来在login.aspx.cs中,加上对登陆button的click事件处理函数,这里我们在IsAuthenticated方法中检查用户名密码是否通过验证,并在通过验证后取得xml文件的roles信息,然后生成 FormsAuthenticationTicket,并将roles信息保存在ticket的userdata中,然后将ticket加入到客户端的 cookie中,同时重定向到用户最初请求的页面。

  1. private void Button1_Click(object sender, System.EventArgs e)  
  2. {  
  3. if(this.IsAuthenticated(TextBox1.Text,TextBox2.Text))  
  4. {  
  5. string userId = TextBox1.Text;  
  6. FormsAuthenticationTicket ticket = new FormsAuthenticationTicket
    (1,userId,DateTime.Now,DateTime.Now.AddSeconds(30),false,roles);  
  7. HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
    FormsAuthentication.Encrypt(ticket));  
  8. Response.Cookies.Add(cookie);  
  9. Response.Redirect(FormsAuthentication.GetRedirectUrl(userId,false),true);  
  10. }  


然后在项目中添加新类,继承IHttpModule接口,实现Init 方法,并且注册需要的方法 :

  1. namespace WebApplication1  
  2. {  
  3. /**////  
  4. /// Summary description for AuthenticationModule.  
  5. /// 
  6.  
  7.     public class AuthenticationModule : IHttpModule  
  8. {  
  9. public AuthenticationModule()  
  10. {  
  11. //  
  12. // TODO: Add constructor logic here  
  13. //  
  14. }  
  15. private void Authentication_Request(object sender,EventArgs e)  
  16. {  
  17. HttpApplication App = (HttpApplication) sender;  
  18. HttpContext Ctx = App.Context ;  
  19. if (Ctx.Request.IsAuthenticated == true)  
  20. {  
  21. FormsIdentity Id = (FormsIdentity)Ctx.User.Identity ;  
  22. FormsAuthenticationTicket Ticket = Id.Ticket ;  
  23. string[] Roles = Ticket.UserData.Split (',') ;  
  24. Ctx.User = new GenericPrincipal (Id, Roles) ;  
  25. }  
  26. }  
  27. IHttpModule Members#region IHttpModule Members  
  28. void IHttpModule.Init(HttpApplication context)  
  29. {  
  30. context.AuthenticateRequest += new EventHandler(this.Authentication_Request);  
  31. }  
  32. void IHttpModule.Dispose()  
  33. {  
  34. }  
  35. #endregion  
  36. }  

在上面的Authentication_Request方法创建一个 FormsIdentity 对象和一个 GenericPrincipal 对象。前一个对象从票名称获得用户名,后一个对象将此标识与用户角色列表包含在一起。

最后,请务必在web.config中注册你刚编写的AuthenticationModule类,位置在刚才修改身份验证方式的system.web的节点下,添加如下代码:

  1.  
  2.  name="AuthenticationModule" type="WebApplication1.
    AuthenticationModule, WebApplication1"
     /> 
  3.   

大功告成,现在可以编译通过后,将index1.aspx设置为起始页,运行一下,是不是重定向到login.aspx页面了?然后分别用user和admin登陆,看看效果。以上介绍ASP.NET的HttpModule

【编辑推荐】

  1. ASP.NET的TypeConverter
  2. 浅析ASP.NET的TypeResolver
  3. ASP.NET中定义JavaScriptConverter
  4. 在ASP.NET中替换Sys.Services的方法
  5. 使用ASP.NET AJAX的Profile Service

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...
2012年第四季度互联网状况报... [[71653]]  北京时间4月25日消息,据国外媒体报道,全球知名的云平台公司Akamai Te...