下面我們進(jìn)入今天的正式學(xué)習(xí)。
【1】.WSE3.0框架介紹
WSE3.0全稱是
因此我們通常會(huì)使用WSE 3.0增強(qiáng) WebSerivice安全。WSE3.0經(jīng)常使用的特性包括如下四個(gè)方面:
(1)基于消息的安全性 (WS-Security) :支持WS-* 協(xié)議
(2)高效的二進(jìn)制數(shù)據(jù)傳輸 (MTOM) :消息傳輸優(yōu)化機(jī)制Message Transmission Optimization Mechanism
(3)可選的宿主環(huán)境 (Host):多個(gè)宿主程序的實(shí)現(xiàn),IIS外托管的支持
(4)自定義聲明性策略管道(Policy):根據(jù)用戶需要自定義策略
首先,WSE 3.0支持WS-* 協(xié)議。它是由IBM、Microsoft 和 Verisign 聯(lián)合發(fā)布,是關(guān)于 Web 服務(wù)安全性(Web Services Security,WS-Security)的規(guī)范,該規(guī)范提供了一套幫助 Web 服務(wù)開發(fā)者保護(hù) SOAP 消息交換的機(jī)制。這個(gè)規(guī)范已經(jīng)被 OASIS 所接受,并且新組建了 Web 服務(wù)技術(shù)委員會(huì)(Web Services Technical Committee,The WSS TC),以促使 WS-Security 成為開放標(biāo)準(zhǔn)。概念性協(xié)議棧規(guī)定了 Web 服務(wù)中構(gòu)建安全性非常重要的額外元素。路線圖中新增的三個(gè)部分,策略層中的兩個(gè)元素和聯(lián)合層中的一個(gè)元素(如圖 所示)
各個(gè)層次的作用相輔相成。其中WS-Trust 通過(guò)定義一組接口開始了定義信任關(guān)系的工作,安全性令牌服務(wù)將為安全性令牌的發(fā)出、交換和驗(yàn)證提供這組接口。它旨在支持創(chuàng)建多種安全性令牌格式,以適應(yīng)各種認(rèn)證和授權(quán)機(jī)制。發(fā)出安全性令牌服務(wù)接受一個(gè)輸入請(qǐng)求(通常還有身份證明),然后以指定的身份所請(qǐng)求的令牌(即一個(gè)特定的業(yè)務(wù)證書)作為響應(yīng)。WS-Secure Conversantion 建立在以安全性令牌為基礎(chǔ)的信任這一概念之上。它描述了如何在策略定義的信任關(guān)系上下文中使用安全性令牌來(lái)使得多個(gè)服務(wù)請(qǐng)求者和服務(wù)提供者能在會(huì)話期間安全地交換信息。安全性空間內(nèi)的這種預(yù)期行為的描述也可以稱之為信任策略,WS-Policy 框架支持信任伙伴表達(dá)和交換他們的信任聲明。WS-Trust 定義了整個(gè)信任關(guān)系的行為,而 WS-SecureConversation 則著重定義了安全通信的安全性上下文(安全性令牌)。
其次,基于消息的安全性和 消息傳輸優(yōu)化機(jī)制MTOM 是人們?cè)?Web Serivice項(xiàng)目中使用 WSE3.0 的兩個(gè)主要原因。另外WSE 3.0 通過(guò)Web Serivice提供的擴(kuò)展來(lái)封裝對(duì)Web Serivice調(diào)用。這使我們就能夠利用各種 WSE 3.0 功能。在實(shí)際開發(fā)中我們只需要WSE 3.0設(shè)置工具并選擇所需的選項(xiàng)。就可以完成對(duì)項(xiàng)目的特定設(shè)置。這些信息會(huì)保存帶配置文件里的對(duì)應(yīng)位置。
再次,多宿主部署。使得我們可以靈活第部署和使用Web Service.而不是單單以來(lái)IIS來(lái)發(fā)布Web服務(wù)。WSE 3.0 使您能夠執(zhí)行 Web Serivice類型的自定義宿主。消息處理類 SOAPSender 和 SOAPReceiver 使您能夠?qū)崿F(xiàn)任何類型的高級(jí)消息處理模式。WSE 3.0 支持 HTTP 和 TCP協(xié)議。允許第三方插入自己的傳輸實(shí)現(xiàn)。
最后,在 Web Serivice項(xiàng)目中啟用 WSE 3.0 的另一個(gè)原因是,要利用它的策略管道擴(kuò)展性模型。WSE 使您能夠插入對(duì)進(jìn)入和離開終結(jié)點(diǎn)的 SOAP 消息執(zhí)行預(yù)處理和后續(xù)處理的篩選器。該擴(kuò)展點(diǎn)比 WebSerivice SOAPExtension 框架更易于使用,因?yàn)樗峁┑墓δ芸梢詣?chuàng)建能夠與 WSE 提供的現(xiàn)有聲明性安全策略相結(jié)合的自定義聲明性策略。
另外還可以使用其提供的 SOAP 消息診斷跟蹤功能。
【2】. 安全基本概念
介紹完WSE3.0的一些基本概念和特性。我們?cè)賮?lái)熟悉一下常見加密技術(shù)、密鑰和證書。
(1)加密技術(shù),為什么要使用加密技術(shù),主要是為了實(shí)現(xiàn)一下目的:
a) 機(jī)密性。確保數(shù)據(jù)的保密性。機(jī)密性通常是使用加密實(shí)現(xiàn)的??梢允褂眉用芩惴ǎㄊ褂眉用苊荑€)將明文轉(zhuǎn)換為密文,并使用相應(yīng)的解密算法將密文轉(zhuǎn)換回明文。對(duì)稱加密算法使用相同的密鑰進(jìn)行加密和解密,而非對(duì)稱算法則使用公鑰/私鑰對(duì)。
b)數(shù)據(jù)完整性。確保數(shù)據(jù)免受意外或者故意(惡意)的修改。完整性通常是由消息身份驗(yàn)證代碼或哈希值提供的。哈希值是從數(shù)據(jù)序列導(dǎo)出的固定長(zhǎng)度的數(shù)值。哈希值用于驗(yàn)證通過(guò)非安全通道傳送的數(shù)據(jù)的完整性??梢詫⑹盏降臄?shù)據(jù)的哈希值與傳送時(shí)數(shù)據(jù)的哈希值進(jìn)行比較,以確定數(shù)據(jù)是否被篡改。
c)身份驗(yàn)證。保證數(shù)據(jù)來(lái)自某一方。數(shù)字證書用于提供身份驗(yàn)證。數(shù)字簽名通常應(yīng)用于哈希值,因?yàn)檫@些值比它們所代表的源數(shù)據(jù)小得多。
(2)密鑰和證書:
非對(duì)稱加密使用公鑰/私鑰對(duì)。對(duì)于使用私鑰加密的數(shù)據(jù),只能使用相應(yīng)的公鑰進(jìn)行解密,反之亦然。(參考MSDN)
(3)簡(jiǎn)單介紹一下常見的加密手段如下:
表 1: .NET Framework 為其提供現(xiàn)成實(shí)現(xiàn)類的算法。
對(duì)稱算法 | 非對(duì)稱算法 | 哈希算法 |
DES(數(shù)據(jù)加密標(biāo)準(zhǔn)) | DSA(數(shù)字簽名算法) | HMAC SHA1(使用 SHA1 哈希算法且基于哈希的消息身份驗(yàn)證代碼) |
TripleDES(三重?cái)?shù)據(jù)加密標(biāo)準(zhǔn)) | RSA | MAC Triple DES(使用 Triple DES 的消息身份驗(yàn)證代碼) |
Rijndael |
| MD5 |
RC2 |
| SHA1、SHA256、SHA384、SHA512(使用各種哈希大小的安全哈希算法) |
a。私鑰加密算法:使用單個(gè)私鑰來(lái)加密和解密數(shù)據(jù)。由于具有密鑰的任意一方都可以使用該密鑰解密數(shù)據(jù)私鑰加密又稱為對(duì)稱加密,因?yàn)橥幻荑€既用于加密又用于解密。私鑰加密并不能實(shí)現(xiàn)數(shù)據(jù)完整性,即防止數(shù)據(jù)被更改;也無(wú)法完成對(duì)身份的驗(yàn)證,即確保數(shù)據(jù)發(fā)自特定的一方。.NET 提供以下實(shí)現(xiàn)類以提供對(duì)稱的密鑰加密算法: DESCryptoServiceProvider RC2CryptoServiceProvider RijndaelManaged TripleDESCryptoServiceProvider
• • • •
b.共鑰加密:公鑰加密使用一個(gè)必須對(duì)未經(jīng)授權(quán)的用戶保密的私鑰和一個(gè)可以對(duì)任何人公開的公鑰。公鑰和私鑰都在數(shù)學(xué)上相關(guān)聯(lián);用公鑰加密的數(shù)據(jù)只能用私鑰解密,而用私鑰簽名的數(shù)據(jù)只能用公鑰驗(yàn)證.NET 通過(guò)抽象基類 (System.Security.Crytography.AsymmetricAlgorithm) 提供下列非對(duì)稱(公鑰/私鑰)加密算法:
• | DSACryptoServiceProvider |
• | RSACryptoServiceProvider |
NET 提供了下列哈希算法:
• | SHA1、SHA256、SHA384、SHA512 |
• | MD5 |
• | HMACSHA(加密的哈希算法) |
• | MACTripleDES(加密的哈希算法 |
d.數(shù)字簽名:數(shù)字簽名驗(yàn)證發(fā)送方的標(biāo)識(shí)并保護(hù)數(shù)據(jù)的完整性。事實(shí)上數(shù)字簽名是基于以上各種加密技術(shù)組合的解決方案。一個(gè)基本的數(shù)字簽名方案可能有如下步驟:雙方各自生成一個(gè)公鑰/私鑰對(duì)。雙方交換他們的公鑰。雙方生成一個(gè)用于對(duì)稱加密法的私鑰,并使用該對(duì)稱私鑰加密要發(fā)送的消息。生成加密后消息的哈希值。用對(duì)方的共鑰加密對(duì)稱私鑰和哈希值(組合密文即為簽名),并將該簽名附加在消息主體的密文后發(fā)送給對(duì)方。
以上知識(shí)簡(jiǎn)單的加密算法的簡(jiǎn)單介紹,具體大家可以查看相關(guān)的安全和加密方面的書籍資料。這里簡(jiǎn)單介紹是為了更好第理解WSE3.0的安全機(jī)制的實(shí)現(xiàn)。
【3】.下載與安裝
下面來(lái)介紹一下WSE 3.0的下載和安裝情況。
(1)WSE 3.0下載地址。下載并安裝WSE 3.0,你可以選擇安裝Tools和Samples,開發(fā)環(huán)境選擇Visual Studio 2005插件方式,開發(fā)過(guò)程中配置Web服務(wù)WSE 3.0特性會(huì)比較方便。
安裝如圖:
一定要選擇插件方式,否則我們本地建立項(xiàng)目的時(shí)候看不到設(shè)置選擇下一步直到安裝完成。
(2)Visual Studio 2005 緊密集成
可以直接添加web服務(wù)引用Add Web Reference/Update Web Reference
可以進(jìn)行WSE3.0設(shè)置 WSE3.0Settings button
(3)單獨(dú)的工具( Tools)
Wse Wsdl生成工具WseWsdl3.exe
Wse配置工具WseConfigEditor3.exe
X509認(rèn)證管理工具X509Certificate3.exe
這些工具都可以在安裝目錄下找到如圖:
WSE 3.0只能和Visual Studio 2005集成安裝。Visual Studio 2008里包含了WCF框架類庫(kù),WCF 定位為新的 .NET Web 服務(wù)平臺(tái),該平臺(tái)能夠完全替代現(xiàn)在對(duì) WSE 所提供功能的需要。
安裝完成以后我們新建Web 服務(wù)項(xiàng)目。可以在項(xiàng)目右鍵屬性里看到WSE 3.0設(shè)置,如圖:
就表示W(wǎng)SE 3.0安裝成功并且可以在項(xiàng)目里使用。
【4】.代碼實(shí)現(xiàn)與分析
上面詳細(xì)講解了WSE的基本概念、基本加密算法和WSE3.0的安裝過(guò)程。下面我們來(lái)進(jìn)行具體的代碼是實(shí)現(xiàn)部分, 之前的《WCF分布式應(yīng)用程序開發(fā)必備知識(shí)系列》第4節(jié)Web服務(wù)已經(jīng)涉及到Web服務(wù)安全的問(wèn)題。當(dāng)時(shí)的實(shí)現(xiàn)機(jī)制略有不同,使用的是SOAPHeader傳遞用戶令牌,在服務(wù)斷進(jìn)行驗(yàn)證。今天我們使用的是WSE3.類庫(kù)里實(shí)現(xiàn)的類UserNameToken來(lái)進(jìn)行用戶名字和密碼的傳輸。項(xiàng)目主要還是包括3個(gè)部分。一個(gè)Web Service項(xiàng)目、一個(gè)UserNameToken類庫(kù)和測(cè)試的客戶端
1)首先來(lái)看MyUsernameTokenManager的實(shí)現(xiàn),它繼承自UsernameTokenManager,而UsernameTokenManager繼承SecurityTokenManager,SecurityTokenManager繼承自接口ISecurityTokenManager。UsernameTokenManager其中比較重要的方法是:
protected virtual string AuthenticateToken(UsernameToken token);
此方法提供了驗(yàn)證互用令牌的具體實(shí)現(xiàn)
public static WindowsPrincipal LogonUser(string username, string password);
實(shí)現(xiàn)Window策略的驗(yàn)證用戶名和密碼
protected virtual void VerifyHashedPassword(UsernameToken token, string authenticatedPassword);
驗(yàn)證用戶的哈希密碼
protected virtual void VerifyPassword(UsernameToken token, string authenticatedPassword);
驗(yàn)證密碼的正確性
protected virtual void VerifyPlainTextPassword(UsernameToken token, string authenticatedPassword);
驗(yàn)證這個(gè)明文密碼的正確性
public override void VerifyToken(SecurityToken token);
最后以個(gè)是驗(yàn)證用戶令牌的包含的用戶名和密碼的有效性。
其中最重要的是AuthenticateToken方法。WSE3.0框架會(huì)調(diào)用我們重寫的方法來(lái)驗(yàn)證從SoapHeader里提取生成的用戶令牌UsernameToken。
下面我們給處具體的代碼:
在代碼中重載AuthenticateToken方法。服務(wù)端接收到含有UsernameToken實(shí)例的SOAP消息后,WSE將 UsernameToken反序列化,并調(diào)用VerifyToken方法,而VerifyToken方法在執(zhí)行過(guò)程中又會(huì)調(diào)用 AuthenticateToken方法,這個(gè)方法會(huì)返回一個(gè)口令值,WSE會(huì)拿它與UsernameToken中的口令進(jìn)行對(duì)比。
2)服務(wù)端實(shí)現(xiàn)很簡(jiǎn)單,只包含一個(gè)方法,代碼如下:
3)客戶端代碼,主要是添加Web 引用。實(shí)例化Web服務(wù)的代理類,設(shè)置UserNameToken來(lái)調(diào)用web 服務(wù)的過(guò)程。
首先是創(chuàng)建Web service proxy的實(shí)例 ServiceWse serviceProxy = new ServiceWse();
然后通過(guò)UsernameToken類的實(shí)例添加用戶名與口令。使用UsernameToken 設(shè)置用戶名和密碼 UsernameToken token = new UsernameToken("FrankXu", "123456789", PasswordOption.SendPlainText);
最后 設(shè)置用戶令牌到服務(wù)代理 serviceProxy.SetClientCredential(token) 調(diào)用服務(wù)方法 string result = serviceProxy.HelloWorld(); 最后運(yùn)行結(jié)果如下:
運(yùn)行結(jié)果顯示成功調(diào)用了服務(wù),并且輸出正確的結(jié)果。
【5】.總結(jié)。
以上是本節(jié)的全部?jī)?nèi)容:WSE3.0框架介紹、安全基本概念、下載與安裝、代碼實(shí)現(xiàn)與分析。這里值得注意的地方:(1)每個(gè)項(xiàng)目都要添加WSE3.0程序集Microsoft.Web.Services3的引用,不然項(xiàng)目會(huì)報(bào)錯(cuò)。最后我還會(huì)照例放出文章的(2)例子代碼比較簡(jiǎn)單。只是簡(jiǎn)單應(yīng)用了WSE3.0的基本機(jī)制。其實(shí)不難理解,WSE3.0的用戶密碼加密就是在客戶端設(shè)置用戶令牌的時(shí)候進(jìn)行。而服務(wù)端的AuthenticateToken方法里實(shí)現(xiàn)的其具體的密碼驗(yàn)證過(guò)程,包括具體的驗(yàn)證策略算法等扥,最終返回的就是客戶端成精傳遞的密碼。
聯(lián)系客服