|
作為一名 Microsoft 服務(wù)顧問,我定期與客戶和合作伙伴一起進行應(yīng)用程序安全性討論。 在本文中,我將介紹一些在這些討論中提出的主題。 特別是,我將重點介紹編程人員在嘗試保護 Silverlight 應(yīng)用程序的安全時所面臨的新挑戰(zhàn),而且我將考慮開發(fā)團隊應(yīng)該將其資源集中于哪些方面。
本文提到了許多技術(shù)概念,您可以在其他位置(包括本雜志)找到這些概念的更多詳細信息。 因此,我就不在技術(shù)層面更加深入地討論這些主題。 本文的目標是“理清頭緒”并介紹如何利用這些概念保護您的應(yīng)用程序的安全。
當規(guī)劃應(yīng)用程序的安全性時,考慮三個 A 非常有用:身份驗證 (Authentication)、授權(quán) (Authorization) 和審核 (Audit)。
身份驗證是確認用戶身份的行為。 我們通常使用用戶名和密碼執(zhí)行此操作。
授權(quán)是指在進行身份驗證之后,確認用戶實際上具有執(zhí)行特定操作或訪問特定資源的適當權(quán)限的過程。
審核是維護活動記錄,以便用戶無法拒絕對系統(tǒng)執(zhí)行的操作和請求的行為。
在 Silverlight 應(yīng)用程序上下文中,我將重點介紹前兩項(身份驗證和授權(quán))。 由于這是一個富 InterNET 應(yīng)用程序 (RIA),因此本文中描述的大多數(shù)概念同樣適用于異步 JavaScript 和 XML (AJAX) 或其他 RIA 方法。 我還將討論如何防止對您的 Silverlight 應(yīng)用程序文件進行不必要的訪問。
拓撲
Silverlight 是一種跨瀏覽器插件,其利用 Windows Presentation Foundation (WPF) 率先采用的許多圖形概念,使 Web 開發(fā)人員能夠創(chuàng)建豐富的用戶體驗,這些用戶體驗將超出僅使用 HTML 和 JavaScript 創(chuàng)建的體驗。
與 ASP.NET 不同的是,Silverlight 是一種客戶端技術(shù),它在用戶的計算機上運行。 因此,Silverlight 開發(fā)無疑與 Windows 窗體或 WPF 有許多共同之處,而與 ASP.NET 的共同之處相對較少。 在許多方面,這是 Silverlight 的最大優(yōu)勢之一,因為它消除了 Web 應(yīng)用程序的無狀態(tài)性所導(dǎo)致的許多問題。 不過,由于所有 UI 代碼都是在客戶端計算機上運行的,因此您不能再相信它。
服務(wù)
與 Windows 窗體不同的是,Silverlight 在瀏覽器沙盒內(nèi)運行且擁有的功能減少,因此它所提供的安全程度提高(盡管在 Silverlight 4 中,用戶可以將某些應(yīng)用程序標識為可信并將程序的權(quán)限提升為允許 COM 互操作)。 正因為如此,Silverlight 不能直接連接到數(shù)據(jù)庫,您必須創(chuàng)建一個可提供對您的數(shù)據(jù)和業(yè)務(wù)邏輯的訪問的服務(wù)層。
例如,您通常會將這些服務(wù)承載于您的 Web 服務(wù)器上,就像使用 ASP.NET Web 窗體一樣。 假定 Silverlight 代碼運行于服務(wù)器與現(xiàn)實世界之間的信任邊界的可信度較差的一側(cè)(參見圖 1),您的團隊的工作重點應(yīng)始終是保護服務(wù)的安全。
圖 1 Silverlight 運行于信任邊界的可信度較差的一側(cè)
在您的 Silverlight 代碼內(nèi)實現(xiàn)嚴格的安全檢查幾乎沒有意義。 畢竟,攻擊者可以很容易就完全擺脫 Silverlight 應(yīng)用程序并直接調(diào)用您的服務(wù),從而避開您實現(xiàn)的任何安全措施。 此外,惡意人員可以使用像 Silverlight Spy或 Debugging Tools for Windows 這樣的實用程序更改您的應(yīng)用程序在運行時的行為。
我們要認識到的重要一點是:服務(wù)無法確切地知道哪個應(yīng)用程序正在調(diào)用它或者該應(yīng)用程序在某些方面尚未被修改。 因此,您的服務(wù)必須確保:
- 調(diào)用方已經(jīng)過適當?shù)纳矸蒡炞C
- 調(diào)用方已獲授權(quán)執(zhí)行所請求的操作
鑒于上述原因,本文的大部分內(nèi)容重點介紹如何采用與 Silverlight 兼容的方式保護服務(wù)的安全。 特別是,我將考慮通過 ASP.NET 在 Microsoft IIS 中承載兩種不同類型的服務(wù)。 第一種類型是使用 Windows Communication Foundation (WCF)創(chuàng)建的服務(wù),它為構(gòu)建服務(wù)提供一種統(tǒng)一的編程模型。 第二種類型是 WCF 數(shù)據(jù)服務(wù)(以前稱為“ADO.NET 數(shù)據(jù)服務(wù)”),其構(gòu)建于 WCF 之上,允許您使用標準 HTTP 謂詞(一種稱為“具象狀態(tài)傳輸”(REST)的方法)快速公開數(shù)據(jù)。
通常,如果擔(dān)心安全性,則加密客戶端和服務(wù)器之間的任何通信始終是明智之舉。 建議使用 HTTPS/SSL 加密,且本文內(nèi)假定使用此加密方法。
目前,Web 開發(fā)人員在 Microsoft 平臺上最常用的兩種身份驗證方法是 Windows 身份驗證和窗體身份驗證。
Windows 身份驗證
Windows 身份驗證利用本地安全機構(gòu)或 Active Directory驗證用戶憑據(jù)。 這在許多方案中都是一大優(yōu)勢;它意味著您可以使用系統(tǒng)管理員已經(jīng)熟悉的工具集中管理用戶。 Windows 身份驗證可以使用 IIS 支持的任何方案,包括基本身份驗證、摘要式身份驗證、集成身份驗證(NTLM/Kerberos)和證書。
在使用 Windows 身份驗證時,通常都會選擇集成方案,因為用戶無需再次提供其用戶名和密碼。 用戶在登錄到 Windows 之后,瀏覽器可采用用于確認個人身份的令牌或握手形式轉(zhuǎn)發(fā)憑據(jù)。 但是由于客戶端和服務(wù)器需要了解用戶的域,使用集成身份驗證有許多缺點。 因此,集成身份驗證最適用于 IntraNET 方案。 此外,盡管它自動與 Microsoft InterNET Explorer 一起使用,但其他瀏覽器(如 Mozilla Firefox)需要進行額外配置。
通常,基本身份驗證和摘要式身份驗證需要用戶在啟動與您的網(wǎng)站的會話時,重新輸入其用戶名和密碼。 但是,由于這兩種身份驗證都屬于 HTTP 規(guī)范,因此它們在大多數(shù)瀏覽器中均可正常使用,即使是從組織外部進行訪問也是如此。
Silverlight 利用瀏覽器進行通信,因此使用剛才討論的任何 IIS 身份驗證方法,均可輕松實現(xiàn) Windows 身份驗證。 有關(guān)如何實現(xiàn)的詳細說明,建議閱讀分步指南“如何:在 Windows 窗體中,使用 WCF 中的 basicHttpBinding 進行 Windows 身份驗證并使用 TransportCredentialOnly”(網(wǎng)址為:msdn.microsoft.com/library/cc949012)。 此示例實際上使用 Windows 窗體測試客戶端,但相同的方法也適用于 Silverlight。
窗體身份驗證
窗體身份驗證是一種為 ASP.NET 中的自定義身份驗證提供簡單支持的機制。 因此,它特定于 HTTP,這意味著它也可在 Silverlight 中輕松使用。
用戶輸入用戶名和密碼組合,此信息將提交給服務(wù)器進行驗證。 服務(wù)器根據(jù)可信的數(shù)據(jù)源(通常是用戶數(shù)據(jù)庫)檢查憑據(jù),如果憑據(jù)正確,則返回一個 FormsAuthentication Cookie。 然后,客戶端在隨后的請求中提供此 Cookie。 Cookie 經(jīng)過簽名和加密,因此只有服務(wù)器才能解密,惡意用戶既無法解密,也無法篡改。
調(diào)用窗體身份驗證的確切方式因登錄屏幕的實現(xiàn)方式而異。 例如,如果在驗證了用戶的憑據(jù)后,使用重定向到您的 Silverlight 應(yīng)用程序的 ASP.NET Web 窗體,您可能不再需要執(zhí)行身份驗證工作。 Cookie 已發(fā)送到瀏覽器,且每當請求該域時,您的 Silverlight 應(yīng)用程序都將繼續(xù)使用該 Cookie。
不過,如果您希望在 Silverlight 應(yīng)用程序內(nèi)實現(xiàn)登錄屏幕,您將需要創(chuàng)建一個公開您的身份驗證方法并發(fā)送相應(yīng) Cookie 的服務(wù)。 但幸運的是,ASP.NET 已經(jīng)提供了您所需要的身份驗證服務(wù), 您只需在您的應(yīng)用程序中啟用它即可。 有關(guān)詳細指南,建議閱讀“如何:使用 ASP.NET 身份驗證服務(wù)通過 Silverlight 應(yīng)用程序登錄”(網(wǎng)址為:msdn.microsoft.com/library/dd560704(VS.96))。
ASP.NET 身份驗證的另一項強大的功能是其可擴展性。 成員資格提供程序描述了用于驗證用戶名和密碼的機制。 幸運的是,ASP.NET 附帶了許多成員資格提供程序,包括一個可使用 SQL Server 數(shù)據(jù)庫的成員資格提供程序,還有一個使用 Active Directory的成員資格提供程序。 然而,如果沒有符合您要求的提供程序,可直接創(chuàng)建一個自定義實現(xiàn)。
ASP.NET 授權(quán)
在您的用戶通過身份驗證后,請務(wù)必確保只有他們才能嘗試調(diào)用服務(wù)。 在 ASP.NET 應(yīng)用程序中,普通 WCF 服務(wù)和 WCF 數(shù)據(jù)服務(wù)均以.svc 文件表示。 本示例中,將在 IIS 中通過 ASP.NET 來承載服務(wù),我將演示如何使用文件夾確保對服務(wù)的安全訪問。
采用這種方式保護.svc 文件的安全有點令人迷惑不解,因為默認情況下,對此類文件的請求實際上會跳過大多數(shù) ASP.NET 管道,從而繞過授權(quán)模塊。 因此,為了能夠利用許多 ASP.NET 功能,您必須啟用 ASP.NET 兼容性模式。 在任何情況下,WCF 數(shù)據(jù)服務(wù)都會強制要求您啟用它。 在您的配置文件內(nèi)進行簡單的切換即可完成任務(wù):
<system.serviceModel> <serviceHostingEnvironment ASPNETCompatibilityEnabled="true"/></system.serviceModel><system.web> <authorization> <deny users="?"/> </authorization></system.web>
NET技術(shù):保護您的 Silverlight 應(yīng)用程序的安全,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。