【原文地址】Tip/Trick: Integrating ASP.NET Security with Classic ASP and Non-ASP.NET URLs
【原文发表日期】 Sunday, March 04, 2007 6:17 PM
别人经常问我的一个问题是,“我怎么能把ASP.NET安全与经典ASP和其他非ASP.NET URLs集成起来?” 具体地来说,他们想知道他们是否能把ASP.NET中的表单认证,基于角色的安全, 以及URL授权等特性与经典ASP,PHP,JSP,.HTM, .JPG以及其他的非ASP.NET URLs集成起来。
好消息是,在今天的ASP.NET 2.0和IIS 6.0中,这非常容易,到IIS 7.0时段时,这将会更加容易。下面的博客帖子将示范如何把ASP.NET的表单认证和登录/成员特性与经典ASP和静态的.HTML文件集成起来。
想了解如何实现这个功能(以及如何把象基于ASP.NET角色的授权与经典ASP应用集成)的更详细的按部就班的示范的话,请阅读Stefan Schackow的精彩好书《ASP.NET 2.0 安全, 成员和角色管理(ASP.NET 2.0 Security, Membership, and Role Management)》中的第六章。
IIS 6.0的通配符映射一些背景知识
Windows Server 2003中的IIS 6.0中添加了对一个被称之为“通配符映射(wildcard mappings)”的ISAPI特性的支持。通配符映射提供了一个方式来配置IIS,使得进入服务器的所有请求首先被转到一个或多个ISAPI扩展作处理。IIS 6.0中的通配符映射一个非常酷的事情是,在处理通配符扩展的ISAPI扩展结束之后,它能使得IIS把请求的控制传递到IIS中通常处理该请求的扩展或内部处理器那里去。
ASP.NET 2.0包括了对利用这个通配符映射特性的内置支持。这允许你在现有的处理非ASP.NET URL(譬如,.asp, .php 或 .htm请求)的ISAPI扩展执行之前和之后运行ASP.NET编码或者你自己的自定义编码。
我们可以使用这个特性来启用一堆酷的集成特性,包括ASP.NET认证和授权特性,来为web服务器上的所有URLs设置安全。
如何配置IIS 6.0通配符映射
为这个例子起见,我将在IIS 6.0管理工具里创建一个新的IIS应用,叫做“wildcardtest”。它指向一个将含有default.aspx, login.aspx, test.asp 和 test.htm几个文件的目录(这后面2个文件代表了通常不由ASP.NET处理的资源):
在默认情形下,当一个对.aspx网页的URL请求到达该应用时,ASP.NET ISAPI 将处理这个请求。在默认情形下,当一个对test.asp的URL请求到达该应用时,经典的ASP ISAPI将处理这个请求,没有ASP.NET编码会运行的。当一个对test.htm的URL请求到达该应用时,IIS6会在内部处理这个请求,同样地,没有ASP.NET编码会运行的。
我们将通过对该应用启用通配符映射来改变这种情形,配置ASP.NET在到达该服务器的所有请求之前和之后运行些编码。想这么做的话,在IIS管理工具里右击当前应用,选择其上的“属性”上下文菜单选项。这会打开应用的属性对话框:
然后,你可以点击“配置(configuration)”按钮,打开该应用的URL映射规则页:
注意,这个对话框的上方列出了默认的ISAPI扩展名映射(每个URL扩展名都映射到了负责处理该扩展名的ISAPI)。对话框的下方列出了“通配应用映射(wildcard application map)”规则。我们可以点击“添加”按钮来给ASP.NET ISAPI添加一个应用的通配符映射,将其指向一个硬盘上的ASP.NET 2.0 ISAPI扩展:
非常重要的事项:确认你不选“核实该文件是存在的(Verify this file exists)”复选框。如果你不这么做的话,象WebResource.axd和其他被ASP.NET处理的但并没有对应物理文件的ASP.NET URL资源会停止工作,这会导致你的网页出错。
接下来,点击OK按钮接受变动,关闭所有的对话框。至此,你就配置了ASP.NET能在每个进入该应用的请求之前和之后运行编码。
对非ASP.NET资源启用表单认证和Url授权
一旦我们完成上面的步骤,把ASP.NET 2.0注册成进入我们IIS应用的所有URLs的通配符映射之后,我们就可以使用标准的ASP.NET认证和授权技术来鉴定我们应用中的用户,准许或拒绝他们的访问。
譬如,我们可以加一个web.config文件到我们的应用中,为该应用启用ASP.NET的表单认证特性,然后建立2个URL授权规则,拒绝“匿名”用户对test.asp和test.htm的访问:
<system.web>
<authentication mode="Forms" />
</system.web>
<location path="test.asp">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="test.htm">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location> </configuration>
现在,当我试图访问"test.asp"或者 "test.htm"时,ASP.NET认证和授权系统会先执行,检查我是否已经通过表单认证登录进当前的应用,如果还没有登录的话,会转向到该应用的login.aspx网页让我来登录:
注意,ASP.NET认证系统在上面使用的"ReturnUrl"已经被设置成"test.asp" url,这样在我登录之后,就会把我重新定向回去 (这跟.aspx网页的情形是一样的)。一旦我成功输入用户名/密码之后,我就能访问 test.asp 网页了:
因为上面的页面是一个经典的ASP文件,很明显地,我不能象在ASP.NET网页里那样使用User.Identity.Name属性来鉴别登录的用户。但是,我可以在经典的ASP网页里从"AUTH_USER"服务器变量中获取用户名(在把处理返回到经典的ASP ISAPI之前,ASP.NET会自动填充这个变量)。
在经典的ASP里使用这个的编码看上去是象下面这样子的:
<body>
<h1>Classic ASP Page</h1>
<h3>
You are logged in as:
<u>
<%=Request.ServerVariables("AUTH_USER") %>
</u>
</h3>
</body>
</html>
点击这里下载实现了上述方案的完整样例应用。在默认情形下,它会使用SQL Express数据库储存ASP.NET 2.0的成员和角色管理数据。或者,你也可以创建和注册SQL 2000或SQL 2005数据库来储存成员和角色管理数据。我以前写的这个老的ASP.NET安全教材示范了该怎么做。
如何进一步了解ASP.NET安全
我强烈推荐你去买一本Stefan Schackow的精彩好书《ASP.NET 2.0 安全, 成员和角色管理(ASP.NET 2.0 Security, Membership, and Role Management)》。 Stefan是ASP.NET开发队伍中的主要成员,拥有和设计了ASP.NET 2.0版本中的安全特性。因此,他实实在在是了解他写出来的东西。
他书中的第六章题为“把ASP.NET安全与经典ASP集成(Integrating ASP.NET Security with Classic ASP)”,内中包含了我在上面示范过的方案的更加详细的细节,以及如何在其中使用角色安全,在ASP.NET 和 classic ASP之间来回传输数据等。
点击这里了解该书的详情或者在线购买。
其他在线ASP.NET安全资源
我在过去发表过许多讨论ASP.NET 2.0安全的ASP.NET 技巧, 诀窍, Recipes 和教程。下面是你也许想温习的几个重要帖子的列单:
- Resource: ASP.NET 2.0 Membership, Roles, Forms Authentication, and Security Resources
- Recipe: Enabling Windows Authentication within an Intranet ASP.NET Web application
- Recipe: Implementing Role Based Security with ASP.NET using Windows Authentication and SQL Server
- Recipe: Configuring ASP.NET 2.0 Application Services to use SQL Server 2000 or SQL Server 2005
- Gotcha: Always set the "applicationName" property when configuring ASP.NET 2.0 Membership and other Providers
- 常见疑难杂症:添加提供器时别忘了先设置<clear/>
- 技巧和诀窍:简单的ASP.NET 2.0 SQL提供器的源码和文档发布
- 技巧和诀窍:防范SQL注入攻击
- Tip/Trick: Gathering Custom User Registration Information
- Recipe: How to add a Login, Roles and Profile system to an ASP.NET 2.0 app in only 24 lines of code
- Gotcha: Authorization with the built-in VS 2005 Web Server (aka Cassini)
- Gotcha: Forms Authentication timeout default changed between ASP.NET 1.1 -> ASP.NET 2.0
- Tip/Trick: How To Share Authentication Cookies across ASP.NET V1.1 and ASP.NET V2.0 Applications
想阅读更多的我写的免费ASP.NET 技巧, 诀窍, 和教程的话,请去看一下我的 ASP.NET 技巧, 诀窍, 和教程列表。
希望本文对你有所帮助,
Scott