现在的位置: 首页 > 综合 > 正文

把ASP.NET安全与经典ASP和非ASP.NET URLs集成

2013年10月01日 ⁄ 综合 ⁄ 共 4684字 ⁄ 字号 评论关闭

【原文地址】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的访问:

<?xml version="1.0"?>

<configuration>

    <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里使用这个的编码看上去是象下面这样子的:

 

<html>
    
<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 和教程。下面是你也许想温习的几个重要帖子的列单:

想阅读更多的我写的免费ASP.NET 技巧, 诀窍, 和教程的话,请去看一下我的 ASP.NET 技巧, 诀窍, 和教程列表

希望本文对你有所帮助,

Scott

 

抱歉!评论已关闭.