摘要:技巧/訣竅:把ASP.NET安全功能與傳統ASP和非ASP.NET URLs整合
【原文位址】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的存取:
<configuration>
<system.web>
<authentication mode=」Forms」 />
</system.web>
<location path=」test.asp」>
<system.web>
<authorization>
<deny users=」?」/>
<allow users=」*」/>
</authorization>
</system.web>
</location>
<locat
ion 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