這裏很多人都有豐富的ASP.NET web應用開發經驗,但是可能有很多人對應用的安全沒有足夠的重視,下面就ASP.NET的安全問題做一個簡要的敘述。
1. 概述
1.1. 配置文件
在創建Asp.net的應用時,Asp.net爲我們提供了配置文件來配置session state、授權和認證等等。有兩個配置文件:
(1) Maching.config——用來定義server的配置,安裝.net framework的時候就安裝了此文件,位於%winDir%/Microsoft.Net/Framework/yourVersion/Config目錄下。此文件中的配置是應用於本機所有虛擬目錄的。
(2) Web.config——針對各個具體的web應用的配置,在各自asp.net應用的目錄下。每個asp.net有自己的web.config文件,而此應用下的每個子目錄也可以有自己的web.config文件,而且下級的web.config文件中的設置覆蓋上級web.config文件中的設置。
1.2. ASP.NET 安全基礎
開發一個安全的ASP.NET應用必須考慮下面的基本的安全裝置:
(1) Authentication——檢查用戶的身份。
(2) Authorization——根據用戶的身份確定其能訪問哪些資源。
(3) Impersonation——就是一個線程使用不同於其所在進程的身份去執行操作的能力。
System.Web.Security 名字空間中提供了很多關於應用安全的類。如:FormsAuthentication、FormsIdentity和PassportIdentity。具體請查閱MSDN。
2. 在ASP.NET應用中執行驗證
驗證——通俗地說就是要檢查來訪者的身份——“來者何人?”
2.1. ASP.NET驗證
ASP.NET使用authentication provider來實現驗證,這些provider包括:
l IIS authentication
l Windows-based authentication
l Forms-based authentication
l Passport authentication
l Anonymous authentication
下面分別說明之:
(1) IIS 認證。任何Web請求必須先通過IIS來訪問ASP.net應用,IIS的認證可以通過IIS管理器進行配置。IIS提供了多種認證裝置,這包括:
l Anonymous access——匿名訪問。當不需要驗證用戶身份的時候使用此方式。
l Basic authentication——基本認證。需要用戶提供用戶名和密碼,但以明文傳輸。這通常需要和SSL/TLS結合使用。
l Digest authentication——摘要式認證。和基本認證類似,但不直接傳輸明文,而是傳輸Hash值。而且,需要IIS Server必須在一個windows域中,且使用AD來保存用戶帳戶。
l Integrated Windows authentication——整合的windows認證。使用windows認證協議通信,使用操作系統中的帳戶。
l Client certificate authentication——客戶端證書認證。使用X.509數字證書來驗證訪問者身份。
(2) 基於Windows的認證。ASP.net應用依賴windows操作系統去驗證用戶。此爲默認選想。驗證的過程爲:Client端請求一個頁面——>IIS檢查windows帳戶,如果不合法則要求其登錄——>用戶登錄成功後,返回其請求的頁面。此驗證方式對於有proxy server的情況下不能工作。
(3) 基於表單的認證。此認證方式使用HTTP 客戶端重定向來重定向未驗證通過的請求到一個HTML表單。其過程爲:Client端請求一個頁面——>ASP.net檢查客戶端的cookie,如果沒有發現則讓用戶登錄——>用戶登錄成功後,返回頁面和驗證cookie給請求者。此驗證方式需要開發者寫驗證邏輯。
(4) Passport認證。由微軟提供的集中認證服務。
(5) 匿名認證。
2.2. Form 驗證
步驟爲:
(1) 在IIS管理器中設置IIS爲匿名訪問。
(2) 在web.config文件配置爲Form認證方式。
<authentication mode="Forms">
<forms loginUrl="login.aspx" />
</authentication>
</system.web>
另一個例子:
<forms name="SavingsPlan" loginUrl="/logon.aspx">
<credentials passwordFormat="SHA1">
<user name="Kim"
password="07B7F3EE06F278DB966BE960E7CBBD103DF30CA6"/>
<user name="John"
password="BA56E5E0366D003E98EA1C7F04ABF8FCB3753889"/>
</credentials>
</forms>
</authentication>
(3) 建立授權。在web.config文件中配置<authorization>節來設定接收或者拒絕用戶訪問,還可以設置哪些頁面需要認證。
(4) 建立一個登錄頁面。在這個頁面上要求用戶輸入用戶名和密碼,然後到保存帳戶信息的地方進行檢查。你可以把帳戶信息放在配置文件、註冊表、數據庫或者AD中。
2.3. Windows 驗證
步驟爲:
(1) 設置IIS爲windows認證,選擇basic、Digest和Integrated windows其中的一種方式。
(2) 配置web.config。
<authentication mode="Windows" />
</system.web>
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
另外還可以使用Passport(微軟提供了個Web Service)驗證,但這個是需要費用的,通常我們不予考慮。
3. 授權
驗名來訪者的身份後,就需要查詢事先設定好的安全策略,以決定授予此來訪者什麼樣的權限。
3.1. ASP.NET 授權
可以使用授權來確定是否一個通過驗證的用戶已經訪問了某個特定的資源。這個授權過程可以讓我們限制用戶的訪問權限——通過賦予或者取消一個用戶所能擁有的特定權限。ASP.NET提供了兩種授權方式:文件授權和URL授權。
(1) 文件授權。當我們使用windows認證的時候,此方式自動生效,它基於IIS的認證。當用戶嘗試訪問某個ASP.NET應用的受保護資源的時候,IIS首先對其進行驗證,之後,ASP.NET檢查NTFS文件權限或者ACL來確定此用戶是否有權限訪問資源。
(2) URL授權。當不使用windows認證的時候,可以使用URL授權。當用戶嘗試訪問某個資源時,URL授權機制根據ASP.NET驗證過程分配給application的角色和application的身份來同意或者拒絕請求者對資源的訪問。使用URL授權可以做如下幾件事情:
! Deny or allow access to individual users or groups of users.
! Deny or allow access to specific roles.
! Restrict access based on the type of HTTP action attempted, such as Get or Post.
例子:
?代表匿名用戶,*代表任何用戶):
<allow users="Domain/user1, Domain/user2"/>
<deny users="*"/>
</authorization>
拒絕匿名用戶訪問(
Domain/Administrators角色的用戶纔可訪問:
<deny users="?"/>
</authorization>
只有擁有
ASP.NET查找<authorization>的子項,直到找到了匹配當前用戶的規則(rule)。
<allow roles="Domain/Administrators"/>
<deny users="*"/>
</authorization>
注意配置節中的內容是有順序關係的,
任何人都不能訪問:
Verb屬性可以限制HTTP的動作(Action):
<deny users="*"/>
<allow roles="Domain/Administrators"/>
<allow users="Domain/user1, Domain/user2"/>
</authorization>
使用
<deny VERB="POST" users="*" />
<allow VERB="GET" users="*" />
4. 扮演(Impersonation)
有時,我們可能需要使用通過驗證的請求者的身份來允許我們的應用,那我們可以使用Impersonation(扮演)。此處的扮演和Windows的扮演有略微不同。
4.1. ASP.NET 扮演
扮演允許一個asp.net應用允許於合法請求者的安全上下文中;典型的,服務器端的某個線程扮演一個客戶端,它可以象這個客戶端那樣訪問服務器資源,或者驗證對此客戶端自己的對象的訪問。比如,一個文件服務器,擁有一些記錄了祕密信息的文件;爲了保護一個未授權的客戶端訪問這些祕密數據,服務器可以在訪問這些文件之前扮演爲客戶端,這樣能提高應用的安全性。當啓用扮演後,asp.net應用依賴IIS驗證請求者的身份。
4.2. 在ASP.NET 應用中執行IIS扮演
扮演在默認情況下是不可用的,可以通過配置啓用之:
windows用戶:
<system.web>
<identity impersonate="true"/>
</system.web>
</configuration>
扮演某個特定的
<system.web>
<identity impersonate="true" userName="MACHINE/user1"
password="exam"/>
</system.web>
</configuration>
5. 保護Web Files和Folders
5.1. Web Folder 權限
爲阻止未授權地訪問web應用,我們需要分配合適的權限給那些可以通過web訪問到的文件夾,這被稱爲web folder permission。
虛擬目錄包括以下權限:
(1) Read——查看目錄、文件內容和屬性。
(2) Write——允許修改文件或者目錄的內容和屬性。
(3) Script source access——允許訪問源文件。需要Read和Write權限作爲前提。
(4) Directory browsing——允許查看文件列表。
(5) Log visits——記錄用戶訪問的每個網站。
執行權限:
(1) None——不能server上執行script和可執行程序。
(2) Scripts Only——只能在server上執行腳本。
(3) Scripts and Executables——在server上Script和可執行程序都可以執行。
5.2. 保護Web Application Files
有如下保護措施:
(1) File and folder ACLs——使用windows操作系統提供的訪問控制列表機制。
(2) IIS Security——IIS提供了一些安全設定。
(3) Web.config——配置文件提供了一些關於安全的配置節,通過設置這些配置節可以保護文件和目錄安全。這些配置節有:
l <authentication>
l <authorization>
l <location>
例子:
<system.web>
<authentication mode="None" />
</system.web>
</configuration>
<system.web>
<authorization>
<allow roles="Admins" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
<system.web>
<identity impersonate ="true" userName ="London/Administrator"
password ="P@ssw0rd" />
</system.web>
</location>