温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ASP.NET的HTTP模块和处理程序的模块实现是怎样的

发布时间:2021-11-24 13:42:11 来源:亿速云 阅读:123 作者:柒染 栏目:编程语言

本篇文章给大家分享的是有关ASP.NET的HTTP模块和处理程序的模块实现是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

实现一个提供安全服务的HTTP模块

现在我们实现一个HTTP模块,它为我们的Web应用程序提供安全服务。该HTTP模块基本上是提供一种定制的身份认证服务。它将接收HTTP请求中的身份凭证,并确定该凭证是否有效。如果有效,与用户相关的角色是什么?通过User.Identity对象,它把这些角色与访问我们的Web应用程序页面的用户的标识关联起来。

下面是该HTTP模块的代码:

using System;  using System.Web;  using System.Security.Principal;   namespace SecurityModules  {   /// Class1的总体描述。    public class CustomAuthenticationModule : IHttpModule   {  public CustomAuthenticationModule()  {  }  public void Init(HttpApplication r_objApplication)  {   // 向Application 对象注册事件处理程序。   r_objApplication.AuthenticateRequest +=   new EventHandler(this.AuthenticateRequest) ;  }   public void Dispose()  {   // 此处空出,因为我们不需要做什么操作。  }   private void AuthenticateRequest(object r_objSender,EventArgs r_objEventArgs)  {   // 鉴别用户的凭证,并找出用户角色。。   1. HttpApplication objApp = (HttpApplication) r_objSender ;   2. HttpContext objContext = (HttpContext) objApp.Context ;   3. if ( (objApp.Request["userid"] == null) ||   4.  (objApp.Request["password"] == null) )   5.  {   6. objContext.Response.Write("<H1>Credentials not provided</H1>") ;   7. objContext.Response.End() ;   8.  }    9. string userid = "" ;   10. userid = objApp.Request["userid"].ToString() ;   11. string password = "" ;   12. password = objApp.Request["password"].ToString() ;      13. string[] strRoles ;   14. strRoles = AuthenticateAndGetRoles(userid, password) ;   15. if ((strRoles == null) || (strRoles.GetLength(0) == 0))   16. {   17.  objContext.Response.Write("<H1>We are sorry but we could not  find this user id and password in our database</H1>") ;   18.  objApp.CompleteRequest() ;   19. }    20. GenericIdentity objIdentity = new GenericIdentity(userid,  "CustomAuthentication") ;   21. objContext.User = new GenericPrincipal(objIdentity, strRoles) ;  }   private string[] AuthenticateAndGetRoles(string r_strUserID,string r_strPassword)  {   string[] strRoles = null ;   if ((r_strUserID.Equals("Steve")) && (r_strPassword.Equals("15seconds")))   {  strRoles = new String[1] ;  strRoles[0] = "Administrator" ;   }   else if ((r_strUserID.Equals("Mansoor")) && (r_strPassword.Equals("mas")))   {  strRoles = new string[1] ;  strRoles[0] = "User" ;    }   return strRoles ;  }   }  }

我们研究一下上面的代码

我们是从Init函数开始的。这个函数把处理程序的AuthenticateRequest事件插入Application(应用程序)对象的事件处理程序列表中。这将导致引发AuthenticationRequest事件的时候Application调用该方法。

我们的HTTP模块初始化之后,我们就可以调用它的AuthenticateRequest方法来鉴别客户端请求。AuthenticateRequest方法是该安全/身份认证机制的核心。在这个函数中:

1和2行提取HttpApplication和HttpContext对象。3到7行检测是否没有给我们提供了用户id或密码。如果没有提供,就显示错误信息,请求处理过程终止。

9到12行从HttpRequest对象中提取用户id和密码。

14行调用一个叫做AuthenticateAndGetRoles的辅助(helper)函数。这个函数主要执行身份验证并决定用户角色。上面的代码采用了硬编码(hard-coded),只允许两个用户使用,但是我们可以扩展这个方法,并添加代码与用户数据库交互操作并检索用户的角色。

16到19行检测是否有角色与用户关联。如果没有就意味着传递给我们的凭证没有通过验证;因此该凭证是无效的。因此,给客户端发送一个错误信息,并且请求结束了。

20和21行非常重要,因为这两行实际上告诉ASP.NET HTTP运行时已登录用户的身份。这两行成功执行以后,我们的aspx页面就能够使用User对象访问这些信息了。

现在我们看一看这种身份验证机制的运行情况。目前我们只允许下面两个用户登录到系统:

· User id = Steve, Password = 15seconds, Role = Administrator

· User id = Mansoor, Password = mas, Role = User

注意用户id和密码是大小写敏感的(区分大小写)。

首先试图不提供凭证登录系统,在IE中输入http://localhost/webapp2/index.aspx将看到下面的消息:

ASP.NET的HTTP模块和处理程序的模块实现是怎样的 

现在试图使用用户id“Steve”和密码“15seconds”登录系统。输入 http://localhost/webapp2/index.aspx?userid=Steve&password=15seconds你将看到下面的欢迎消息:

ASP.NET的HTTP模块和处理程序的模块实现是怎样的

现在试图使用用户id“Mansoor”和秘码“mas”登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=mas你将看到下面的欢迎消息页面:

ASP.NET的HTTP模块和处理程序的模块实现是怎样的

现在试图使用错误的用户id和密码组合来登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=xyz你将看到下面的错误消息:

ASP.NET的HTTP模块和处理程序的模块实现是怎样的

这表明我们的安全模块在起作用了。你可以通过在AuthenticateAndGetRoles方法中使用数据库访问代码来扩展该安全模块。

要使所有的部分都起作用,我们必须对web.config文件进行一些修改。首先,由于我们要使用自己的身份验证,因此不需要其它的身份验证机制。为了达到这个目的,改变webapp2的web.config文件中的<authentication>节点,如下所示:

<authentication mode="None"/>

类似地,不允许匿名用户访问我们的Web站点。给web.config文件添加下面的语句:

<authorization>  <deny users="?"/>  </authorization>

用于至少能够匿名访问用于提供凭证的文件。在web.config文件中使用下面的配置设置信息把index.aspx作为***能够匿名访问的文件:

<location path="index.aspx">   <system.web>  <authorization>   <allow users="*"/>  </authorization>   </system.web>  </location>

以上就是ASP.NET的HTTP模块和处理程序的模块实现是怎样的,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI