服務熱線
153 8323 9821
在個人所經歷的幾個ASP.NET項目中經常被權限問題困擾,大部分時間都是因為站點的運行帳號配置有問題。偶然發現這篇文章,感覺對ASP.NET中各種帳號的配置及使用講解比較透徹,讀來受益匪淺,所以翻譯過來跟大家分享。這篇是本人第一次翻譯,有不準確或者錯誤的地方,大家多指點。
所有應用程序在進程內運行。在IIS6.0中,ASP.NET Web程序運行在IIS工作進程(w3wp.exe)內。在默認情況下,該進程以Network Service帳號下運行。相似的,在IIS5.0(以及在IIS5.0隔離模式下運行的IIS6.0)中,ASP.NET Web程序運行在ASP.NET工作進程(aspnet_wp.exe)內。該進程在默認情況下以ASPNET帳號運行。 ASP.NET的架構允許用戶修改此配置,以保證Web程序的安全運行。
應用程序域(Application Domain)是與進程對等的CLR(Application domains are the common language runtime equivalent to process boundaries.)。一個進程可以包含多個應用程序域。盡管多個應用程序域同在一個進程內,運行在一個應用程序域中的代碼無法訪問被另一個應用程序域中的代碼所使用的內存空間。
在IIS6.0中,IIS會為每個應用程序池(Application Pool)創建一個IIS工作進程。每個應用程序池內都包含零到多個Web程序。每個Web應用程序都運行在各自的應用程序域內。應用程序域與Web應用程序的映射的好處在于當一個應用程序池中的Web程序出現嚴重錯誤時,運行在其他應用程序池中的Web程序不會受影響。
如前所述,在默認情況下,IIS工作進程和ASP.NET工作進程分別以Network Service和ASPNET身份運行。在Window Server 2003系統中,用戶可以通過查看ASP.NET Web程序的應用程序池的屬性中的Identity標簽來查看該進程的運行帳號,如下圖所示:
在Window 2000和XP系統中,用戶可以查看Web服務器的machine.config文件中的<processModel>元素的配置來確定進程運行帳號。該屬性支持一下兩個最常見的屬性:
該屬性指定ASP.NET工作進程的運行賬戶。該賬戶可以是任何有效本機帳號或者域帳號。除此之外,用戶還可以指定以下值:
- System : 該值指定ASP.NET工作進程以Local System帳號運行。Locao System具有較高的權限(具有完全的管理權限),故指定該帳號時需謹慎。
- Machine :該值指定ASP.NET工作進程以ASP.NET service帳號運行。該身份就是Window Server2003下的Network Service帳號,WindowsXP下的ASPNET帳號。
該值指定前面所設置用戶的密碼。如果上面的UserName指定的是Machine,該值應設為autogenerate。
當IIS工作進程或者ASP.NET工作進程啟動一個Web程序,而且該Web程序禁用了impersonation,那么該Web程序使用IIS或ASPNET工作進程中設置的帳號運行。如果Web程序啟動了Impersonation,則Web程序使用通過IIS驗證的用戶帳號或者在Web.config中配置的帳號。可以通過以下2種方式啟用Impersonation:
<identity impersonate="true"/>
該條件下,Web程序使用通過IIS驗證的帳號運行。
<identity impersonate="true" userName="someUserName" password="somePassword"/>
該配置指定運行Web程序使用所配置帳號運行。
如果在IIS中只啟用了匿名訪問,IIS傳遞給Web程序的帳號是匿名帳號,亦即<machine>\IUSER_<machine>,其中<machine>是運行IIS的服務器名稱。如果IIS中只啟用了Windows集成驗證,那么IIS傳遞給Web程序的帳號則是通過驗證的Windows帳號。如果同時啟用了兩者,IIS傳遞給Web程序的帳號則是通過IIS驗證的帳號。IIS首先嘗試以匿名方式訪問Web程序或者資源。如果匿名方式無權限訪問,則IIS嘗試使用Windows驗證。
獲取ASP.NET 程序的當前用戶帳號可以使用以下下兩個對象:
該方法返回一個WindowsIdentity實例,亦即運行該線程的帳號。
User.Identity對象代表從IIS傳遞到Web程序的用戶帳號。若IIS允許用戶匿名訪問某頁面,則User.Identity.Name屬性值為空字符串,否則,將會返回通過IIS驗證的用戶帳號。
假設一個Web程序,其在IIS的配置為啟用Windows集成驗證,Web程序所使用的應用程序池的Identity屬性配置為Network Service。下表對比了在不同Impersonation/Anonymous acess配置情況下,當域用戶BVS\JamesH訪問該Web程序時,上述兩個對象的輸出情況:
在啟用Impersonation的情況下,Web程序以IIS傳遞過來的帳號運行。如果禁用了Impersonation,Web程序則以IIS工作進程或ASPNET工作進程所配置的帳號運行。IIS工作進程所使用的帳號在由應用程序使用的應用程序池的Identity屬性指定。ASP.NET工作進程所使用的帳號在服務器的machine.config文件中的<processModel>節配置。