ASP.NET 默認情況下并不是用網站的匿名帳戶來運行的,而是用一個固定的帳戶來運行的,比如 Windows 2000 中是 ASPNET,顯然虛擬主機中大家都用同一個帳戶來運行就會造成具有相同的 NTFS 權限,這是很明顯的安全隱患。在 Windows 2000 中可以通過模擬來實現不同的虛擬主機使用不同的帳戶運行 ASP.NET,具體有些復雜,請參見 正確配置虛擬主機中 ASP.NET 權限。而 Windows 2003(IIS 6)配置又有不同,Windows 2008(IIS 7)中配置又不同。不過 Windows 2008 中是最方便的。
我們還是從模擬開始,模擬就是在 ASP.NET 配置文件中配置 <identity impersonate="true" />,這樣運行 ASP.NET 時就不全是固定的帳戶了(Windows 2000 中為 ASPNET、Windows 2003、2008 中為 Network Service),而是運行網站的匿名帳戶。為了敘述方便,我們稱為半模擬(官方無此名稱,僅僅是為了本文敘述方便)。
模擬也可以指定特定的帳戶 <identity impersonate="true" userName="" password="" />,同樣為了敘述方便,我們把這種稱為全模擬(官方無此名稱,僅僅是為了本文敘述方便)。
我們經過測試,得出幾個表,現列出來,為了便于表格不撐大,用了縮寫,現將縮寫說明如下:
- AppPool 應用程序池帳戶
- NS 對站點 Network Service 是否需要對站點根目錄有 NTFS 權限。
- Principal System.Security.Principal.WindowsIdentity.GetCurrent().Name 的值
- NS Network Service
- demo 運行網站的匿名帳戶
- NS 文件 Network Service 具有讀取權限的文件
- demo 文件 deom 具有讀取權限的文件
- NSdemo 文件 Network Service、demo 均具有讀取權限的文件
- SSPI 普通應用程序用 Windows 身份驗證連接 SQL Server 時的帳戶。
- Membership ASP.NET 中的 Membership 用 Windows 身份驗證連接 SQL Server 時的帳戶。
另外啟用全模擬時:在 Windows 2003 中,將 demo 加入了 IIS_WPG 組;在 Windows 2008 中,將 demo 加入了 IIS_IUSRS 組。不然會無法訪問 C:\WINDOWS\Microsoft.NET\Framework 這個文件夾(實際上 2008 中加不加都可以,因為沒加的話,運行時會自動動態加入)。
Windows 2003 中的情況
模擬情況 | AppPool | NS 對站點 | Principle | 讀 NS 文件 | 讀 demo 文件 | 讀 NSdemo 文件 | SSPI | Membership |
不啟用 | NS | 需要 | NS | 成功 | 失敗 | 成功 | NS | NS |
不啟用 | demo | 需要 | NS | 成功 | 失敗 | 成功 | NS | NS |
半模擬 | NS | 需要 | demo | 失敗 | 失敗 | 成功 | demo | NS |
半模擬 | demo | 需要 | demo | 失敗 | 失敗 | 成功 | demo | NS |
全模擬 | NS | 需要 | demo | 失敗 | 失敗 | 成功 | demo | demo |
全模擬 | demo | 需要 | demo | 失敗 | 失敗 | 成功 | demo | demo |
可以看出若使用半模擬,有個問題就是 Membership 用 Windows 身份驗證去連接 SQL Server 時并不是運行當前網站的帳戶,而是統一的 Network Service,這點是個遺憾。使用全模擬可以解決這個遺憾,但帳戶方面配置起來又很復雜。
Windows 2008 中的情況
模擬情況 | AppPool | NS 對站點 | Principle | 讀 NS 文件 | 讀 demo 文件 | 讀 NSdemo 文件 | SSPI | Memberhip |
不啟用 | NS | 需要 | NS | 成功 | 失敗 | 成功 | NS | NS |
不啟用 | demo | 不需要 | demo | 失敗 | 成功 | 成功 | demo | demo |
半模擬 | NS | 需要 | demo | 失敗 | 成功 | 成功 | demo | NS |
半模擬 | demo | 不需要 | demo | 失敗 | 成功 | 成功 | demo | demo |
全模擬 | NS | 需要 | demo | 失敗 | 成功 | 成功 | demo | demo |
全模擬 | demo | 不需要 | demo | 失敗 | 成功 | 成功 | demo | demo |
從表中可以看出,在 Windows 2008 中配置 ASP.NET 虛擬主機權限隔離非常方便,甚至都不需要什么模擬,只需要將應用程序池的帳戶設置為網站的匿名帳戶就可以了。