監(jiān)理公司管理系統(tǒng) | 工程企業(yè)管理系統(tǒng) | OA系統(tǒng) | ERP系統(tǒng) | 造價(jià)咨詢管理系統(tǒng) | 工程設(shè)計(jì)管理系統(tǒng) | 甲方項(xiàng)目管理系統(tǒng) | 簽約案例 | 客戶案例 | 在線試用
X 關(guān)閉

保證.NET Web服務(wù)安全的必備知識(shí)

申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114

AMTeam.org

保證.NET Web服務(wù)安全的必備知識(shí)


 
一、概述

談到.NET Web服務(wù),安全是最重要的問(wèn)題之一。一旦把商務(wù)應(yīng)用的一部分作為Web服務(wù)實(shí)現(xiàn),就應(yīng)當(dāng)能夠確保商務(wù)數(shù)據(jù)不會(huì)出現(xiàn)問(wèn)題;類似地,如果商務(wù)應(yīng)用依賴于Web服務(wù),也應(yīng)當(dāng)確保發(fā)送給Web服務(wù)和從Web服務(wù)接收的數(shù)據(jù)不會(huì)受到任何威脅。本文總結(jié)了保證Web服務(wù)安全性的各種可用方案,針對(duì)可能遇到的各種情形提出一些建議。

首先,有兩個(gè)概念是必須熟悉的:驗(yàn)證(Authentication),授權(quán)(Authorization)。如果把Web服務(wù)比喻為一幢大樓,驗(yàn)證是安全警衛(wèi)的責(zé)任,他在人們進(jìn)入大樓時(shí)檢查每一個(gè)人的證件,阻止不帶合法證件的人進(jìn)入大樓。類似地,要訪問(wèn)Web服務(wù),客戶程序也必須通過(guò)身份驗(yàn)證。授權(quán)也就是訪問(wèn)控制,相當(dāng)于各個(gè)房間上的鎖起到的作用。要進(jìn)入房間就必須有該房間的鑰匙。類似地,要調(diào)用Web服務(wù)的某個(gè)功能,客戶程序必須獲得調(diào)用該功能的授權(quán)。本文的討論主要面向Web服務(wù)安全的驗(yàn)證問(wèn)題。

.NET Web服務(wù)和其他Web應(yīng)用相似,它們的安全機(jī)制都可以分為兩個(gè)大類:系統(tǒng)實(shí)現(xiàn)的安全機(jī)制,應(yīng)用實(shí)現(xiàn)的安全機(jī)制。采用系統(tǒng)安全機(jī)制時(shí),應(yīng)用依賴于平臺(tái)服務(wù)來(lái)提供必要的驗(yàn)證和授權(quán)功能;采用應(yīng)用安全機(jī)制時(shí),應(yīng)用本身必須提供所有進(jìn)行身份驗(yàn)證和授權(quán)的代碼。系統(tǒng)安全機(jī)制的主要優(yōu)點(diǎn)是,開(kāi)發(fā)者不必編寫(xiě)和測(cè)試任何代碼。IIS服務(wù)器提供了適合許多情形的大量驗(yàn)證方法(參見(jiàn)本文后面的參考資源)。然而,采用系統(tǒng)安全機(jī)制時(shí),應(yīng)用也同時(shí)受到平臺(tái)安全服務(wù)固有局限的束縛。應(yīng)用本身實(shí)現(xiàn)的安全機(jī)制靈活性最高,但代價(jià)是代碼必須由開(kāi)發(fā)者自己編寫(xiě)。

二、系統(tǒng)安全

圖一顯示了選擇安全機(jī)制的決策樹(shù),可以幫助你選擇合適的驗(yàn)證機(jī)制。從圖一可以看出,Web服務(wù)的安全選項(xiàng)和其他Web應(yīng)用的相似,選擇安全機(jī)制的根據(jù)是網(wǎng)絡(luò)環(huán)境和應(yīng)用的需求。如果你正在構(gòu)造的Web服務(wù)用于Intranet內(nèi)部,則選擇與網(wǎng)絡(luò)拓?fù)溆嘘P(guān)。如果Web服務(wù)的用戶與Web服務(wù)在同一個(gè)域之內(nèi),或者Web服務(wù)的用戶在Web服務(wù)的域信任的域之內(nèi),可以使用Windows集成的驗(yàn)證機(jī)制(Integrated Windows Authentication)。在這種集成的安全機(jī)制下,Windows將使用當(dāng)前登錄用戶的證書(shū)。對(duì)于最終用戶來(lái)說(shuō),這是很方便的,因?yàn)橛脩粢坏┑卿浟薟indows工作站,他的身份信息也將自動(dòng)適用于Web服務(wù)應(yīng)用。

 

如果用戶不在一個(gè)被信任的域之內(nèi),下一步必須決定:是利用Windows帳號(hào)創(chuàng)建和管理用戶帳號(hào),還是使用應(yīng)用本身的帳號(hào)。如果使用Windows帳號(hào),創(chuàng)建和維護(hù)用戶帳號(hào)的工具是免費(fèi)的。然而,在這種情況下,用戶訪問(wèn)應(yīng)用時(shí)實(shí)際上是利用IIS登錄到了Windows服務(wù)器或Windows域。

此外,一旦依賴于Web服務(wù)器上本地定義的用戶帳號(hào),則增加額外的Web服務(wù)器時(shí)會(huì)出現(xiàn)很多麻煩,必須把所有的帳號(hào)復(fù)制到每一個(gè)新增的Web服務(wù)器上?;趹?yīng)用的帳號(hào)要靈活得多,具有更好的可伸縮性,因?yàn)樵谶@種情況下,用戶帳號(hào)可以保存到一個(gè)可供所有Web服務(wù)器訪問(wèn)的中心數(shù)據(jù)庫(kù)。但這時(shí),所有創(chuàng)建和維護(hù)用戶帳號(hào)的工具都必須由開(kāi)發(fā)者自己編寫(xiě)。

讓W(xué)indows管理用戶帳號(hào)有兩種可能的驗(yàn)證方式。如果系統(tǒng)中使用了Windows 2000域控制器,且所有的客戶都使用IE 5或更高版本,則可以使用Digest驗(yàn)證。Digest驗(yàn)證是IETF(Internet Engineering Task Force)的標(biāo)準(zhǔn)驗(yàn)證機(jī)制。在這種驗(yàn)證方式下,客戶程序(IE 5)在把用戶證書(shū)發(fā)送給服務(wù)器(IIS 5)之前,將先對(duì)證書(shū)進(jìn)行加密。

如果系統(tǒng)不能滿足采用Digest驗(yàn)證必須符合的全部要求,另一種選擇是Basic驗(yàn)證。Basic驗(yàn)證是一個(gè)比較老的IETF標(biāo)準(zhǔn)。采用這種驗(yàn)證方式時(shí),客戶程序以明文的形式將用戶證書(shū)發(fā)送給服務(wù)器。Basic驗(yàn)證方式經(jīng)常和安全套接字層(Secure Socket Layer,SSL)一起使用,對(duì)客戶端和服務(wù)器端發(fā)送的所有數(shù)據(jù)都加密,以免用戶證書(shū)被竊取。但是,如果在Intranet環(huán)境內(nèi)使用Basic驗(yàn)證,你可能不需要使用SSL,以避免SSL帶來(lái)的性能影響。

對(duì)于在Internet上運(yùn)行的Web服務(wù),選擇安全機(jī)制的過(guò)程與Intranet環(huán)境下用戶在非安全域的情形類似。主要的區(qū)別在于,一旦決定采用Basic或應(yīng)用自身實(shí)現(xiàn)的驗(yàn)證機(jī)制,通常還需要加上SSL以確保用戶證書(shū)的安全,因?yàn)橛脩糇C書(shū)要通過(guò)Web傳遞。這里的決定因素是用戶密碼的重要程度。例如,如果用戶驗(yàn)證只是為了便于提供個(gè)性化的內(nèi)容,根據(jù)用戶所在城市提供天氣信息,則密碼被竊取的可能性不大。另一方面,如果驗(yàn)證身份是為了讓用戶進(jìn)入股票交易系統(tǒng),用戶可以在該系統(tǒng)內(nèi)買(mǎi)賣(mài)股票,則最好使用SSL。

無(wú)論是使用集成的安全驗(yàn)證,還是使用Basic、Digest安全驗(yàn)證,都要對(duì)IIS服務(wù)器進(jìn)行配置,就象為普通Web應(yīng)用配置IIS服務(wù)器一樣。此外,ASP.NET也要經(jīng)過(guò)配置。因?yàn)?NET Web服務(wù)運(yùn)行在ASP.NET框架的基礎(chǔ)上,而ASP.NET又運(yùn)行在IIS的基礎(chǔ)上,要保證Web服務(wù)的運(yùn)行安全,所有這些地方都必須正確地配置(參見(jiàn)圖二)。

MSDN主題“ASP.NET Data Flow”(參見(jiàn)本文后面的參考資源)揭示了在兩種常見(jiàn)的情形下,IIS和ASP.NET如何一起協(xié)作保證ASP.NET應(yīng)用的安全。ASP.NET驗(yàn)證機(jī)制在Web.config文件中配置,Visual Studio.NET把這個(gè)XML文件放在包含Web服務(wù)的應(yīng)用的根下。在Web.config文件中,authentication元素的mode屬性可以是下面四個(gè)值之一:None,Windows,F(xiàn)orms,或Passport。例如,在下面的例子中,“None”選項(xiàng)關(guān)閉了ASP.NET安全驗(yàn)證:

<authentication mode="None"/>

把驗(yàn)證模式設(shè)置為Windows意味著應(yīng)用依賴于IIS實(shí)施驗(yàn)證,對(duì)應(yīng)于本文前面所謂的系統(tǒng)安全機(jī)制。把IIS配置成除匿名訪問(wèn)之外的任何其他驗(yàn)證形式時(shí)我們使用該選項(xiàng)。也就是說(shuō),這個(gè)選項(xiàng)本身不保證對(duì)用戶進(jìn)行身份驗(yàn)證,使用該選項(xiàng)時(shí)還應(yīng)當(dāng)把IIS設(shè)置成除匿名訪問(wèn)之外的其他驗(yàn)證形式。

Forms(表單)驗(yàn)證以前也叫做Cookie驗(yàn)證,實(shí)際上是系統(tǒng)驗(yàn)證和應(yīng)用驗(yàn)證之間的一種混合驗(yàn)證類型。表單驗(yàn)證類型向用戶顯示一個(gè)表單,要求用戶輸入名字和密碼。實(shí)際的驗(yàn)證過(guò)程由開(kāi)發(fā)者編寫(xiě)的代碼完成,例如通過(guò)一個(gè)用戶信息數(shù)據(jù)庫(kù)完成。用戶順利通過(guò)身分驗(yàn)證之后,應(yīng)用把一個(gè)唯一的鍵值以Cookie的形式寫(xiě)入到客戶端??蛻舫绦蛟诿恳粋€(gè)后繼的請(qǐng)求中,把這個(gè)Cookie發(fā)送給服務(wù)器,服務(wù)器負(fù)責(zé)在處理請(qǐng)求之前檢驗(yàn)這個(gè)Cookie。這種驗(yàn)證類型不適用于Web服務(wù),因?yàn)橐话愣?,Web服務(wù)的客戶程序不知道如何處理登錄表單。如果能夠?yàn)閃eb服務(wù)編寫(xiě)一個(gè)定制的代理服務(wù)器,則只要提供了提交登錄表單(帶有用戶名字和密碼)的代碼和處理Cookie的代碼,表單驗(yàn)證或許也能夠適用于這種場(chǎng)合。另外值得指出的是,表單驗(yàn)證有一個(gè)缺點(diǎn),這就是用戶名字、密碼和Cookie都是以明文的形式傳遞,惡意的黑客可能竊取這些信息。

最后,Passport驗(yàn)證使用Microsoft的Passport服務(wù)。Passport相當(dāng)于Web上的Windows集成安全機(jī)制,它允許用戶在Web會(huì)話期間登錄,然后從一個(gè)支持Passport的站點(diǎn)轉(zhuǎn)到另一個(gè)支持Passport的站點(diǎn),且無(wú)需在每一個(gè)站點(diǎn)上反復(fù)登錄。Passport驗(yàn)證也是以表單為基礎(chǔ)的:用戶必須在一個(gè)HTML表單中輸入名字和密碼,然后把這些信息發(fā)送給Passport服務(wù)器。

如果你選擇使用Passport,可以用www.passport.com/sdkdocuments/sdk21/default.htm 的Passport SDK把用戶的證書(shū)發(fā)送到Passport服務(wù)。因此,除非Web服務(wù)的客戶程序知道如何處理Passport登錄請(qǐng)求,否則,在Web服務(wù)環(huán)境下使用Passport驗(yàn)證是不可能的。

如果依賴于IIS實(shí)施驗(yàn)證,Web服務(wù)的客戶程序可以把用戶的證書(shū)附帶在發(fā)送給服務(wù)的HTTP請(qǐng)求中發(fā)送。當(dāng)客戶程序也建立在.NET框架上時(shí),這種處理方式尤其方便。首先創(chuàng)建一個(gè)NetworkCredentials對(duì)象,把用戶名字(用戶ID)和密碼傳入該對(duì)象的構(gòu)造函數(shù)。然后,利用這個(gè)NetworkCredentials對(duì)象設(shè)置Web服務(wù)代理的Credentials屬性。下面是一個(gè)使用Web服務(wù)的例子,Web服務(wù)的名字是Invoicing:

Dim inv As New com.Invoicing() inv.Credentials =New NetworkCredential ("AppUser","password ") '在下面這個(gè)調(diào)用中證書(shū)被傳遞給Web服務(wù)器 inv.DoWork()

三、應(yīng)用安全

從上面的說(shuō)明可以看出,每一種基于IIS的驗(yàn)證方式都有各自的局限。由于這些局限的存在,再加上應(yīng)用往往有一些特殊的要求,所以許多時(shí)候你會(huì)發(fā)現(xiàn)讓?xiě)?yīng)用自己處理用戶驗(yàn)證是最好的選擇。

不管應(yīng)用驗(yàn)證機(jī)制的具體實(shí)現(xiàn)方式如何,從體系上看它們實(shí)際上都是一樣的。首先,客戶程序發(fā)送用戶名字和密碼,然后應(yīng)用通過(guò)這些信息驗(yàn)證用戶的身份。例如,應(yīng)用可能在數(shù)據(jù)庫(kù)中查找客戶程序提供的用戶名字,然后比較客戶程序提供的密碼和數(shù)據(jù)庫(kù)中保存的密碼。

如果用戶名字和密碼都是正確的,應(yīng)用會(huì)生成一個(gè)鍵(一個(gè)唯一的字符串形式的Bit序列),然后把這個(gè)鍵發(fā)送給客戶程序,同時(shí)在一個(gè)鍵緩沖區(qū)中保存這個(gè)鍵。此后,客戶程序在每一個(gè)請(qǐng)求中把該鍵發(fā)送給應(yīng)用。對(duì)于每一個(gè)客戶程序發(fā)送的請(qǐng)求,應(yīng)用在鍵緩沖區(qū)中檢查客戶程序提供的鍵,根據(jù)檢查結(jié)果判斷客戶是否已經(jīng)通過(guò)身份驗(yàn)證。

實(shí)現(xiàn)這種驗(yàn)證機(jī)制時(shí)有幾個(gè)方面的問(wèn)題需要考慮。首先,必須考慮在網(wǎng)絡(luò)上傳輸用戶證書(shū)和鍵時(shí),如何保證它們的安全。如果Web服務(wù)的客戶程序是定制的,則把這些敏感信息發(fā)送給服務(wù)器之前,可以讓客戶程序先加密這些信息。然而,要正確地實(shí)現(xiàn)這一點(diǎn),還有一些問(wèn)題需要解決,例如:如何同步客戶程序和服務(wù)器使用的密匙,如何在客戶端保證密匙的安全。許多時(shí)候,你應(yīng)該考慮用SSL加密客戶程序和服務(wù)器之間的通信過(guò)程,而不是自己實(shí)現(xiàn)加密。盡管使用SSL會(huì)帶來(lái)一定的性能影響,但對(duì)于大多數(shù)商務(wù)應(yīng)用來(lái)說(shuō),客戶程序和服務(wù)器之間傳送的數(shù)據(jù)都是不可泄漏的,安全遠(yuǎn)比有限的性能影響重要。

大多數(shù)情況下,Web服務(wù)上必須有一個(gè)支持客戶程序登錄Web服務(wù)的方法:

<WebMethod()>Public Function Logon(ByVal userId As _ String,ByVal pwd As String)As String Dim authKey As String If SecurityMgr.Logon(userId,pwd,authKey)Then Return authKey Else Throw New Exception( "用戶名字或密碼錯(cuò)誤!") End If End Function

該方法通過(guò)Users數(shù)據(jù)庫(kù)表檢查用戶名字(userID)和密碼的合法性。如果用戶名字和密碼是合法的,該方法隨機(jī)生成一個(gè)鍵,并把這個(gè)鍵保存到名為AuthKeys的數(shù)據(jù)庫(kù)表。另外,該方法還在名為L(zhǎng)astUsed的字段中保存當(dāng)前的日期和時(shí)間。此后,程序可以利用LastUsed字段確定鍵是否已經(jīng)過(guò)期。

接下來(lái)還要考慮如何在每一個(gè)后繼請(qǐng)求中發(fā)送鍵。一種可用的方法是,可以在每一個(gè)Web服務(wù)的方法中加入一個(gè)表示鍵的字符串參數(shù),指示客戶程序提供這個(gè)參數(shù)。但這里推薦使用SOAP頭。SOAP頭是一種擴(kuò)展機(jī)制,允許為SOAP協(xié)議增加新的功能。在.NET框架下,定義和使用SOAP頭是很方便的。同樣,用SOAP Toolkit 2.0處理SOAP頭也很方便。如果客戶程序使用的是其他SOAP工具,請(qǐng)首先檢查從客戶程序發(fā)送SOAP頭是否簡(jiǎn)單易行。

要使用SOAP頭,首先要?jiǎng)?chuàng)建一個(gè)從SoapHeader派生的類,加入必要的公用成員:

Public Class authHeader Inherits SoapHeader Public authToken As String End Class

然后,聲明該類的實(shí)例為Web服務(wù)類的一個(gè)成員變量:

<WebService(Namespace:= "......")>_ Public Class Invoicing Inherits System.Web.Services.WebService '身份驗(yàn)證用的SOAP頭 Public authHdr As authHeader

接下來(lái)是關(guān)鍵部分。對(duì)于Web服務(wù)中每一個(gè)需要該SOAP頭的方法(對(duì)于本例,所有的方法都需要該SOAP頭,因?yàn)樗松矸蒡?yàn)證的鍵),加上一個(gè)SoapHeader屬性:

<WebMethod(),SoapHeaderAttribute("authHdr", Direction:=SoapHeaderDirection.In, Required:=True)>_ Public Function SubmitInvoice(ByVal invoiceDoc As _ String) As Integer

.NET框架從SOAP請(qǐng)求提取出SOAP頭,并用它填寫(xiě)authHdr的authToken成員。Web服務(wù)的代碼讀取authHdr.authToken,檢查鍵是否合法。你可以為AuthKeys表編寫(xiě)一個(gè)存儲(chǔ)過(guò)程檢查鍵的合法性,如果鍵是合法的,則更新LastUsed字段以反映最新的使用日期和時(shí)間。

在客戶端,已經(jīng)生成的Web服務(wù)代理有一個(gè)名為authHeaderValue的屬性??蛻舫绦虮仨毎言搶傩栽O(shè)置為一個(gè)新的authHeader實(shí)例,把它的authToken屬性設(shè)置為調(diào)用LogOn返回的鍵:

Private _inv As com.Invoicing Private Sub btnLogOn_Click(ByVal sender _ As System.Object, _ ByVal e As System.EventArgs)Handles btnLogOn.Click _inv =New com.Invoicing() '登錄到Web服務(wù) Dim authKey As String =_inv.Logon( _ txtUserName.Text,txtPwd.Text) '設(shè)定驗(yàn)證信息 _inv.authHeaderValue =New com.authHeader() _inv.authHeaderValue.authToken =authKey End Sub

客戶程序只有在首先實(shí)例化Web服務(wù)代理之后,才能執(zhí)行上述步驟。此后,客戶程序就可以保留和使用該代理的實(shí)例,且不必再每次都重新登錄或設(shè)置SOAP頭信息了。

利用SOAP頭發(fā)送驗(yàn)證信息能夠確保Web服務(wù)代碼簡(jiǎn)潔,能夠允許客戶程序一次設(shè)置SOAP頭信息之后反復(fù)使用。這種驗(yàn)證體系思路清楚,且使得客戶程序和Web服務(wù)的代碼具有更好的可讀性。

四、應(yīng)付“拒絕服務(wù)”攻擊

在為Web服務(wù)實(shí)現(xiàn)安全機(jī)制之前,有兩個(gè)問(wèn)題必須清楚。首先,如果安全子系統(tǒng)利用數(shù)據(jù)庫(kù)連接之類的緊缺資源來(lái)確定發(fā)出請(qǐng)求的用戶是否具有合法身份,系統(tǒng)將面臨“拒絕服務(wù)”攻擊。要避免這個(gè)問(wèn)題,必須修改前面給出的示范驗(yàn)證系統(tǒng)。

一種修改的辦法是,創(chuàng)建一個(gè)驗(yàn)證鍵的hash碼,把鍵發(fā)送到客戶端之前,把hash碼連接到鍵的后面。這樣,在每一個(gè)客戶請(qǐng)求中,可以得到鍵以及附加到鍵后面的hash碼。你可以方便地重新為客戶程序返回的鍵構(gòu)造出hash碼,把這個(gè)hash碼和客戶程序返回的hash碼比較,如果兩者不能匹配,則說(shuō)明客戶程序返回的鍵非法,這時(shí)就不必再訪問(wèn)數(shù)據(jù)庫(kù)驗(yàn)證鍵的合法性了。在MSDN的一篇文章中,Mary Kirtland詳細(xì)地說(shuō)明了這種機(jī)制,介紹了MSDN小組如何在“Favorites”Web服務(wù)中使用這種機(jī)制(參見(jiàn)參考資源“Authentication and Authorization”)。

其次,在使用其他人開(kāi)發(fā)的Web服務(wù)時(shí)應(yīng)該慎重。公用Web服務(wù)可能由于“拒絕服務(wù)”攻擊或其他原因而關(guān)閉,如果在Web應(yīng)用中使用了公用的Web服務(wù),應(yīng)當(dāng)保證Web應(yīng)用能夠妥善地處理這類情形。編寫(xiě)Web服務(wù)的客戶程序時(shí)應(yīng)該考慮到最壞的情形。如果客戶程序是一個(gè)運(yùn)行關(guān)鍵任務(wù)的應(yīng)用,則不應(yīng)該依賴于公用Web服務(wù)執(zhí)行其核心任務(wù)。

總而言之,實(shí)現(xiàn)Web服務(wù)安全機(jī)制的辦法不止一種,選擇時(shí)必須考慮多種因素,包括網(wǎng)絡(luò)環(huán)境和客戶端情況。自己實(shí)現(xiàn)驗(yàn)證機(jī)制具有最好的靈活性。只要選擇了一種合適的機(jī)制,Web服務(wù)安全可能變得既容易實(shí)現(xiàn),又容易使用。

發(fā)布:2007-03-25 10:35    編輯:泛普軟件 · xiaona    [打印此頁(yè)]    [關(guān)閉]
相關(guān)文章:
上海OA系統(tǒng)
聯(lián)系方式

成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)

重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓

咨詢:400-8352-114

加微信,免費(fèi)獲取試用系統(tǒng)

QQ在線咨詢