開發安全的ASP.NET應用程式

iDotNetSpace發表於2008-09-12

Web應用程式會遭到幾種型別的攻擊,其破壞效果會因程式本身的不同而不同。因此,安全性是與程式的用法和使用者與其功能互動的方式密切相關的。那麼,應該如何來設計和編碼ASP.NET應用程式呢?

  從應用程式的角度來看,安全性通常指對使用者的鑑別以及對系統資源授予訪問許可權。ASP.NET提供了許多鑑別和授權機制,它們與IIS、。NET Framework以及作業系統底層的安全服務是相連的。

  當一個客戶端發出一個Web請求時,將發生下列順序的鑑別和授權事件:

  1.IIS鑑別

  2.ASP.NET鑑別

  3.ASP.NET授權

  鑑別使用者

  如果頁面是可以被察看的,而請求來自一個非受限的IP地址,IIS將通過預定義的鑑別機制來對呼叫請求進行鑑別。首先IIS確保請求來自一個可信任的IP地址。如果不是,請求將以HTTP錯誤403.6而被拒絕。第二個措施是檢查被請求的資源是否可以被讀或被瀏覽。如果不是,請求將以HTTP錯誤403.2而被拒絕。然後IIS嘗試使用Intergrated、Digest或Basic方法來鑑別這個呼叫。如果用到了Windows的Intergrated方法,Kerberos或NTLM將被使用。如果請求通過了這一關,就輪到ASP.NET出場了。

  ASP.NET支援三種型別的鑑別方法:Windows、Forms和Passport.如果ASP.NET被配置為Windows鑑別,則它不需要其它的步驟,而是直接承認任何從IIS傳來的安全標記。如果ASP.NET被配置為Forms鑑別,將使用一個HTML表單提示使用者輸入信任資料。通過使用者ID和密碼在儲存的合法使用者列表中查尋。應用程式可以任意選擇最合適的儲存機制,包括SQL Server資料庫或Active Directory服務。最後如果ASP.NET被配置為Passport鑑別,使用者將被轉入一個Passport Web站點並由Passprot服務來鑑別。

  第四中型別的鑑別是None,這意味著ASP.NET並不執行自己的鑑別而是完全依靠已經由IIS執行的鑑別。在這種情況下,匿名使用者可以連線進來,而訪問資源使用的是ASP.NET賬戶。將ASP.NET鑑別模式設定為None並不妨礙程式實現自己的鑑別層。

  在Web.config檔案中通過使用區段來選擇ASP.NET的鑑別機制。預設的鑑別模式是Windows.

  授權

  當然,鑑別只是意味著使用者被確認為是其本身。下一步是確認使用者擁有足夠的許可權來訪問請求的資源。

  在鑑別完之後,ASP.NET將校驗呼叫是否被授權用以訪問請求的資源來執行操作。一對HTTP模組提供了這項服務:UrlAuthorizationModule和FileAuthorizationModule.前者確保Web.config檔案中區段中的授權規則完全實現。後者在使用Windows鑑別時來檢查呼叫是否有足夠的訪問許可來訪問請求的資源。在這種情況下,通過比較訪問資源的控制列表(ACL)呼叫的標記來執行校驗。在處理過程中,也可以用。NET roles來改變呼叫者的許可權以便使用某個資源。

  授權規則由兩部分獨立的資訊組成,它們定義了哪些是允許的那些事禁止的。在區段內,標記定義了允許的使用者、任務和操作。相反,在標記中包含了不被允許的使用者、任務和操作。

  你也許注意到鑑別模式只能在machine.config檔案或在程式層的Web.config檔案中設定,子目錄繼承了程式的鑑別模式。但是,授權設定可以在每個子目錄的Web.config檔案中設定。換句話說,授權比鑑別支援更細。

  基於角色的安全

  如果你需要鑑別使用者,你同樣需要為他們建立個性化的頁面。這裡有兩大的選擇:一是實現一個個人資料系統,為每個使用者儲存配置資訊;二是定義一些角色,把使用者對映到這些角色上。

  在第一種情況下,要維護個人資料記錄,可能需要儲存與使用者介面有關的設定以及開啟或關閉的功能。在設計頁面時,訪問這些個人資料記錄來為當前使用者生成相應的頁面。

  如果你不必維護每個使用者的資訊,而只是要將使用者分類並維護基於每一類的資訊,那基於角色的方法就顯得更好。一個角色是一個名稱——一個簡短的描述性字串——它為屬於這個角色的每個使用者定義了一組功能、使用者介面元素以及許可權。

  定義角色需要兩個步驟。首先,定義所有可能的角色,為每個使用者分配其中的一個或多個。這通常在資料庫層完成。典型的,你在儲存使用者名稱字和密碼的資料庫中加入一列來儲存每個使用者的角色。

  鑑別一個使用者時,其身份並沒有和任何角色資訊關聯。但是,有一個功能用來來檢查某一個身份是否屬於特定的已定義角色。可以使用Page.User物件的IsInRole功能來檢驗一個使用者的角色: if(User.IsInRole(“Boss”))

  Response.Write(“The user is the boss”);

  定義角色的第二步是將每個已鑑別的使用者與角色相關聯。要這樣做,你必須建立一個新的主體物件,其型別可以是普通的或與授權種類相同。通常在Global.asax檔案中處理AuthenticateRequest事件時完成: //角色是根據當前使用者從資料庫中讀出的字串

  Context.User=new GenericPrincipal(User.Identity,role);

  這時,鑑別模組能夠通過本地Web.config檔案的區段來檢驗使用者的角色。例如,一個其Web.config檔案如下所示的資料夾裡的頁面只能被屬於Boss角色的使用者訪問:   鑑別模組使用IsInRole函式通過角色來授權。

  保護你的應用程式

  保護一個Web應用程式就必須保護Web伺服器不受各種攻擊,但是它還需要實現有效的辦法來阻止對頁面的非法訪問。ASP.NET提供了一些內建的程式碼來對使用者和操作來進行鑑別和授權。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-446871/,如需轉載,請註明出處,否則將追究法律責任。

相關文章