ASP.NET的模擬應(yīng)用程序
ASP.NET 應(yīng)用程序可以選擇以這些應(yīng)用程序當(dāng)前正為之操作的客戶的身份執(zhí)行。通常這樣做的原因是為了避免在 ASP.NET 應(yīng)用程序代碼中處理身份驗(yàn)證和授權(quán)問題。而您依賴于 Microsoft Internet 信息服務(wù) (IIS) 來(lái)驗(yàn)證用戶,然后將已通過驗(yàn)證的標(biāo)記傳遞給 ASP.NET 應(yīng)用程序;或者,如果無(wú)法驗(yàn)證用戶,則傳遞未經(jīng)身份驗(yàn)證的標(biāo)記。不論何種情況,如果啟用了“模擬”,則 ASP.NET 應(yīng)用程序會(huì)模擬所收到的任何標(biāo)記。當(dāng)前模擬客戶的 ASP.NET 應(yīng)用程序依賴于 NTFS 目錄和文件中的設(shè)置來(lái)允許客戶獲得訪問權(quán)限或拒絕其訪問。務(wù)必將服務(wù)器文件空間格式化為 NTFS,以便可以設(shè)置訪問權(quán)限。
默認(rèn)情況下禁用模擬。為了 ASP 的兼容性,用戶必須顯式啟用模擬。如果為給定的應(yīng)用程序啟用模擬,則 ASP.NET 總是模擬 IIS 提供給 ISAPI 擴(kuò)展的訪問標(biāo)記。該標(biāo)記既可以是已驗(yàn)證用戶標(biāo)記,也可以是匿名用戶的標(biāo)記(如 IUSR_MACHINENAME)。不論應(yīng)用程序中使用哪種身份驗(yàn)證類型,模擬都會(huì)發(fā)生。
只能模擬應(yīng)用程序代碼,編譯和配置作為進(jìn)程標(biāo)記讀取。編譯的結(jié)果放在“Temporary ASP.NET files”目錄中。所模擬的帳戶需要對(duì)該目錄的讀/寫訪問權(quán)。如果應(yīng)用程序位于通用命名規(guī)則 (UNC) 共享上,除非使用配置帳戶,否則,ASP.NET 將總是模擬提供給 IIS 的標(biāo)記來(lái)訪問該共享。如果提供了顯式配置的帳戶,ASP.NET 將使用該帳戶取代 IIS UNC 標(biāo)記。確實(shí)需要基于每個(gè)請(qǐng)求的模擬應(yīng)用程序可以直接配置為模擬提交請(qǐng)求的用戶。
默認(rèn)情況下,在計(jì)算機(jī)級(jí)別上禁用模擬。而且除非被重寫,否則所有的應(yīng)用程序域都繼承此設(shè)置??梢酝ㄟ^將配置文件放置在應(yīng)用程序根目錄下來(lái)啟用模擬。有關(guān) ASP.NET 配置系統(tǒng)的更多信息,請(qǐng)參見 ASP.NET 配置。
與其他配置指令的情況相同,此指令分層應(yīng)用。除非被顯式重寫,否則,層次結(jié)構(gòu)中的嵌套程序?qū)⒆駨乃?。此設(shè)置的默認(rèn)值如下所示。
- <impersonation enable="false"/>
為應(yīng)用程序啟用模擬的最小配置文件可能看上去和下面的示例類似。
- <!-- Web.config file. -->
- <identity impersonate="true"/>
還有以可配置身份運(yùn)行應(yīng)用程序的名稱支持。例如:
- <identity impersonate="true" userName="contoso\Jane" password="pass"/>
這將允許整個(gè)應(yīng)用程序以 contoso\Jane 運(yùn)行,不論請(qǐng)求的身份如何,只要密碼正確即可。可以將這種類型的模擬委托給另一臺(tái)計(jì)算機(jī)。
您可以以編程的方式讀取被模擬用戶的標(biāo)識(shí),如下例所示。
- [Visual Basic]
- Dim username As String = System.Security.Principal.WindowsIdentity.GetCurrent().Name
- [C#]
- String username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
在上例中,userName 和 password 以明文形式存儲(chǔ)在配置文件中。雖然 IIS 不傳輸 .config 文件來(lái)響應(yīng)用戶代理請(qǐng)求,但是可以通過其他途徑讀取配置文件,例如通過在包含服務(wù)器的域上具有適當(dāng)憑據(jù)的已經(jīng)過身份驗(yàn)證的用戶。為了增強(qiáng)安全性,標(biāo)識(shí)部分支持在注冊(cè)表中存儲(chǔ)加密的 userName 和 password 屬性,如下例所示。
- userName="registry:HKLM\Software\AspNetIdentity,Name"
- password="registry:HKLM\Software\AspNetIdentity,Password"
字符串中位于關(guān)鍵字 registry 之后和逗號(hào)之前的部分表示 ASP.NET 打開的注冊(cè)表項(xiàng)的名稱。逗號(hào)之后的部分包含一個(gè)字符串值的名稱,ASP.NET 從此名稱中讀取憑據(jù)。必須有逗號(hào),并且憑據(jù)必須存儲(chǔ)在 HKLM 配置單元中。如果配置格式不正確,則 ASP.NET 不會(huì)啟動(dòng)輔助進(jìn)程,然后將顯示造成當(dāng)前帳戶創(chuàng)建失敗的代碼路徑。
憑據(jù)必須為 REG_BINARY 格式,并且包含 Windows API 函數(shù) CryptProtectData 調(diào)用的輸出。可以用 ASP.NET 設(shè)置注冊(cè)表控制臺(tái)應(yīng)用程序 (Aspnet_setreg.exe) 來(lái)創(chuàng)建加密憑據(jù)并將它們存儲(chǔ)在注冊(cè)表中。該應(yīng)用程序使用 CryptProtectData 完成加密。若要同 Visual C++ 源代碼和文檔一起下載 Aspnet_setreg.exe,請(qǐng)?jiān)L問 Web 站點(diǎn) www.asp.net并搜索“aspnet_setreg”。
應(yīng)該對(duì)存儲(chǔ)加密憑據(jù)的密鑰的訪問權(quán)限進(jìn)行配置,僅向 Administrators 和 SYSTEM 提供訪問權(quán)。由于密鑰會(huì)被作為 SYSTEM 運(yùn)行的 ASP.NET 進(jìn)程讀取,因此應(yīng)設(shè)置以下權(quán)限:
Administrators:F
SYSTEM:F
CREATOR OWNER:F
ProcessAccount:R
這可以提供兩道保護(hù)數(shù)據(jù)的防線:
ACL 權(quán)限要求訪問數(shù)據(jù)的身份是 Administrator。
攻擊者必須在服務(wù)器上運(yùn)行代碼 (CryptUnprotectData) 才能恢復(fù)帳戶的憑據(jù)。以上介紹ASP.NET的模擬應(yīng)用程序
【編輯推薦】