ASP.NET的HTTP模块和处理程序之模块实现
2012-04-21 20:19
309 查看
我们研究一下上面的代码
我们是从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将看到下面的消息:
现在试图使用用户id“Steve”和密码“15seconds”登录系统。输入 http://localhost/webapp2/index.aspx?userid=Steve&password=15seconds你将看到下面的欢迎消息:
现在试图使用用户id“Mansoor”和秘码“mas”登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=mas你将看到下面的欢迎消息页面:
现在试图使用错误的用户id和密码组合来登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=xyz你将看到下面的错误消息:
这表明我们的安全模块在起作用了。你可以通过在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>
结论
你可能已经意识到有了HTTP处理程序和模块后,ASP.NET已经给开发者提供了强大的能量。把你自己的组件插入ASP.NET请求处理管道,享受它的优点吧。
作为练习,你应该进一步改进程序,使示例身份验证模块更加灵活,并能根据用户的需要进行调整。
我们是从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将看到下面的消息:
现在试图使用用户id“Steve”和密码“15seconds”登录系统。输入 http://localhost/webapp2/index.aspx?userid=Steve&password=15seconds你将看到下面的欢迎消息:
现在试图使用用户id“Mansoor”和秘码“mas”登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=mas你将看到下面的欢迎消息页面:
现在试图使用错误的用户id和密码组合来登录系统。输入http://localhost/webapp2/index.aspx?userid=Mansoor&password=xyz你将看到下面的错误消息:
这表明我们的安全模块在起作用了。你可以通过在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>
结论
你可能已经意识到有了HTTP处理程序和模块后,ASP.NET已经给开发者提供了强大的能量。把你自己的组件插入ASP.NET请求处理管道,享受它的优点吧。
作为练习,你应该进一步改进程序,使示例身份验证模块更加灵活,并能根据用户的需要进行调整。
相关文章推荐
- ASP.NET HTTP模块和处理程序(1)(转载)
- ASP.NET 3.5核心编程学习笔记(41):HTTP处理程序与HTTP模块
- ASP.NET HTTP 模块和 HTTP 处理程序概述
- ASP.NET HTTP模块和处理程序(7)
- ASP.NET HTTP模块和处理程序(2)(转载)
- ASP.NET中的HTTP模块和处理程序
- ASP.NET HTTP模块和处理程序(1)
- ASP.NET HTTP模块和处理程序(3)(转载)
- ASP.NET中的HTTP模块和处理程序[收藏]
- ASP.NET HTTP模块和处理程序(4)(转载)
- ASP.NET中的HTTP模块和处理程序
- ASP.NET中的HTTP模块和处理程序
- ASP.NET中的HTTP模块和处理程序[收藏]
- ASP.NET中的HTTP模块和处理程序
- asp.net利用自定义Http处理程序实现URL伪静态之初探
- ASP.NET HTTP模块和处理程序(5)(转载)
- (2020-10-11)ASP.NET中HTTP模块和HTTP处理程序
- ASP.NET中的HTTP模块和处理程序
- ASP.NET HTTP模块和处理程序(2)
- ASP.NET HTTP模块和处理程序(6)(转载)