繼WSE3.0構建Web服務安全(1):WSE3.0安全機制與實例開發和WSE3.0構建Web服務安全(2):非對稱加密、公鑰、密鑰、證書、簽名的區別和聯系以及X.509 證書的獲得和管理之後,今天我們繼續WSE3.0構建Web服務安全系列文章的第3節:WSE3.0策略配置與實例開發.本節主要講解如何通過WSE3.0策略配置工具實現Web服務安全,本在全文附帶代碼講解。本節結構為1.WSE3.0策略工具介紹2.如何使用WSE3.0策略工具3.代碼實現與分析4.總結。最後附上代碼供大家下載。
通過上2節的介紹我們知道:WSE 3.0是和Web Service整合在一起。通過對Web Service服務消息模型的擴展實現安全加密機制。 WSE 3.0中,客戶端請訪問Web服務是通過客戶端生成的一個Proxy類來完成。當客戶端向服務端發送Web Service調用請求的時候,WSE 3.0擴展框架會對消息進行一些處理,包括過濾、加密、簽名等。而服務器端Web Service在收到客戶端的調用請求後,WSE 3.0擴展框架同樣會先對SOAP消息進行解密、簽名的驗證等操作。如果合法則相應用戶請求,否則就拋出服務不可用異常給客戶端。這些工作都是由WSE 3.0擴展框架自動完成解密、簽名的驗證等操。
WSE 3.0提供的安全機制保證了Web Service的安全。同時實現安全的方式也有兩種,一種就是通過的WSE3.0策略工具根據應用系統的安全規格給服務端和客戶端設置相應的安全策略。其次就是用代碼實現具體的安全策略相同的功能。第一種方式方便快捷,通過簡單的設置即可完成Web服務的安全。後者用戶可以定義更具體的代碼來擴展自己的安全策略,相對來說需要自己寫策略代碼。不論采用那種方式,我們都可以利用WSE 3.0提供的安全機制守衛我們的Web服務。
另外WSE 3.0也提供了其他的一些特性,例如多宿主托管Web服務、用戶自定義的安全斷言、對消息傳輸優化機制MTOM的支持、使用TCP傳輸控制協議傳遞SOAP消息等。我們也可以根據實際的系統需求來利用WSE 3.0提供的新特性,優化我們的系統。第一節中我們也提到在 Web Serivice項目中啟用 WSE 3.0 的一個重要原因,就是要利用它的策略管道擴展性模型。因為WSEWSE 3.0 使您能夠插入對進入和離開終結點的 SOAP 消息執行預處理和後續處理的篩選器,它提供的功能可以創建能夠與WSEWSE 3.0 提供的現有聲明性安全策略相結合的自定義聲明性策略。下面我們來介紹一下WSE3.0配置工具,以及如何配置安全策略。
【1】WSE3.0策略工具介紹
首先我們來介紹一下這個工具。WSE3.0具體的安裝細節已經在第一節WSE3.0構建Web服務安全(1):WSE3.0安全機制與實例開發中做了介紹。當我們安裝完畢會在新建的Web Service Vsual Studio 2005 項目右鍵菜單看到WSE 3.0設置。打開以後會出現配置工具的具體界面。如圖:
它包括的通用、安全、路由、策略、令牌問題、調試、消息7個選項卡。
1)通用選顯卡包括是否在項目裡支持WSE3.0和WSE3.0 SOAP消息工廠。
2)安全選顯卡可以設置用戶令牌管理類庫,以及證書和消息的有效時間。
3)路由選項卡可以設置消息中介者SoapHttpRouter對進入和傳出的消息加密。
4)策略選項卡可以更具安全需求對服務端和客戶端設置特定的安全策略,策略會存儲在相應的安全策略文件裡。
5)令牌問題選項卡可以設置令牌的TTL有效存活時間。以及是否使用安全上下文令牌。
6)調試選項卡可以設置項目的具體調試的細節。消息輸入和輸出的的文件以及是否舒服錯誤信息等。
7)消息選項卡主要是對消息優化傳輸機制MTOM的一些設置。
【2】如何使用WSE3.0策略配置工具
以上簡單介紹了WSE3.0策略配置工具,下面我們來具體介紹主要選項的具體使用過程。
1)如果用戶選擇了項目裡支持WSE3.0和WSE3.0 SOAP消息工廠。
會在相應的配置WebConfig文件裡自動添加一下信息。
<section name="microsoft.web.services3" type="Microsoft.Web.Services3.Configuration.WebServicesConfiguration, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<webServices>
<soapServerProtocolFactory type="Microsoft.Web.Services3.WseProtocolFactory, Microsoft.Web.Services3, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</webServices>
</system.web>
配置文件更新完畢代表剛才的設置成功。
2)用戶可以在這裡設置安全選顯卡可以設置用戶令牌管理類庫,以及證書和消息的有效時間。如圖
這裡設置的UsernameTokenManager類庫為我們自己定義的類庫,設置時要正確填寫DLL的名稱、命名空間、類的信息。完成以後會在配置文件裡生成代碼。
<security>
<securityTokenManager>
<add type="MyUsernameTokenManager.MyUsernameTokenManager, UsernameTokenManagerClassLib" namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" localName="UsernameToken" />
</securityTokenManager>
</security>
3)路由選項卡可以設置消息中介者SoapHttpRouter對進入和傳出的消息加密,這裡就不做詳細的介紹,具體大家可以參考MSDN。
4)策略選項卡可以更具安全需求對服務端和客戶端設置特定的安全策略。用戶可以決定是否使用策略和策略的管理。
服務端和客戶端添加策略的文件類似,當用戶選擇添加策略文件的時候,會啟動一個策略配置向導,你輸入策略名稱後,就可以繼續下一步。如圖
用戶可以選擇可以給客戶端還是服務端進行策略設置,客戶端認證方法包括4種。
A.Anonymous 匿名訪問,不需要提供用戶名和密碼。服務器默認客戶端請求已經進行加密。
B.Username 需要包含用戶名和密碼的Usernametoken的安全令牌。
C.Certificate 需要提供服務端認證的X.509證書。
D.Windows 需要提供服務端認證的KerberosT令牌,此方式不屬於WS-*安全協議的范疇,使用Windows Kerberos 認證機制。
如果在向導中選擇消息傳輸保護,還需要設置安全需求比如是否支持WS-*安全協議1.1擴展、簽名、加密等策略,如圖:
A.None :SOAP消息應當在傳輸層依賴安全套接層協議(SSL,Security Socket Layer)提供保護,WSE在傳輸層不提供保護。
B.Sign-Only :客戶端需要對SOAP消息簽名。保證消息的唯一性。
C.Sign and Encrypt:WSE對SOAP消息簽名,且對SOAP消息體加密,來保證消息安全。
D.Sign, Encrypt, Encrypt Signature:WSE對 SOAP消息必須簽名、消息體簽名加密 、對簽名進行加密。
使用匿名方式生成的策略是
<policy name="ServerPolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
表示只依賴於傳輸層安全機制,但是這個安全級別比較低。消息容易被截獲和破譯。
5)令牌問題選項卡可以設置令牌的TTL有效存活時間。以及是否使用安全上下文令牌。
令牌生存期為30秒,設置後對應的配置文件節點為
<tokenIssuer>
<ttlInSeconds value="30" />
</tokenIssuer>
6)調試選項卡可以設置項目的具體調試的細節。消息輸入和輸出的的文件以及是否舒服錯誤信息等。
具體的設置後生成的配置節點如下:
<diagnostics>
<trace enabled="true" input="InputTrace.webinfo" output="OutputTrace.webinfo" />
<detailedErrors enabled="true" />
</diagnostics>
這樣可以輸入錯誤消息,便於調試。
7)消息選項卡主要是對消息優化傳輸機制MTOM的一些設置。
如果使用消息優化機制,可以設置相應的選項,
<messaging>
<mtom clientMode="On" serverMode="always" />
</messaging>
這樣表示一直使用消息優化傳輸機制。
【3】代碼實現與分析
通過上面對WSE3.0配置工具的消息介紹,現在我們來使用WSE3.0配置工具來進行簡單的項目配置。
在介紹代碼實現以前,先要強調一點,WSE3.0安全機制的工作原理,比如簽名。我們在使用策略工具進行設置,對消息消息簽名,會要求你提供一個X509證書,也就是服務端認證的公鑰。來對消息加密。服務端配置的策略的同時會在服務端提供對應的私鑰進行解密,我們要做的就是提供認證的證書和設置安全策略文件。加密和解密驗證的過程由WSE3.0來為我們完成。下面我們還是以上次的代碼的基礎上,來演示我們的具體WSE3.0策略工具的配置過程。使用證書的加密和解密的代碼我會給出講解,但是就不會給具體的實現了。(XP無法安裝證書服務機構,自己制作的證書需要認證通過後,才能使用)幾種方式的配置有類似之處,大家有興趣可以查閱MSDN的資料。或者留言交流。
1)服務端:服務器端策略配置使用Username 方式,需要客戶端提供用戶名和密碼的Usernametoken的安全令牌。具體策略文件對應節點如下:
<policy name="ServerPolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
服務端代碼需要做相應的更改,添加使用策略的屬性標識Microsoft.Web.Services3.Policy("ServerPolicy")]。具體代碼如下:
[Microsoft.Web.Services3.Policy("ServerPolicy")]
public class Service : System.Web.Services.WebService
{
public Service () {
//Uncomment the following line if using designed components
//InitializeComponent();
}
[WebMethod]
public string HelloWorld()
{
return "Hello Guys, Frank Xu Lei.is testing WSE3.0 Setting Policy";
}
}
2)客戶端:
客戶端與服務端配置相對應的安全策略。即提供用戶名和密碼的Usernametoken的安全令牌。策略相同:
<policy name="ClientPolicy">
<usernameOverTransportSecurity />
<requireActionHeader />
</policy>
客戶端的測試代碼做做了相應更新。需要設置代理策略,語句是serviceProxy.SetPolicy("ClientPolicy");具體代碼如下
// 創建Web service proxy的實例
ServiceWse serviceProxy = new ServiceWse(); //通過UsernameToken類的實例添加用戶名與口令。
UsernameToken token = new UsernameToken("FrankXu", "123456789", PasswordOption.SendPlainText);
//MessageSignature _messageSignature = new MessageSignature(token);
//_messageSignature.SigningKey
// 設置用戶令牌到服務代理
serviceProxy.SetClientCredential(token);
// 代理設置策略
serviceProxy.SetPolicy("ClientPolicy");
//調用服務方法
string result = serviceProxy.HelloWorld();
try
{
Console.WriteLine(result); //打印結果
Console.WriteLine("Calling {0}", result);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
//釋放對象資源
if(serviceProxy != null)
serviceProxy.Dispose();
// Success!
Console.WriteLine("Web Service called successfully");
//For debug
Console.WriteLine("Press any key to continue");
Console.ReadLine();
這個表示服務端和客戶端使用了相同的安全策略。客戶端按照策略把用戶名和密碼封裝到UsernameToken裡,添加到Soap消息裡,發送給服務端。服務端根據策略解析Soap消。反序列化UsernameToken。然後進行用戶名和密碼的安全驗證。
3)運行演示:
【4】總結
另外如果用戶服務安全使用簽名,加密,加密使用到證書等安全策略,可以使用WSE3.0配置工具設置具體策略到wse3policyCache.config文件中,來實現系統的安全。此外也可以使用WSE3.0提供的類庫來利用代碼實現。代碼如下:
//如下代碼實現了和 wse3policycache.config一樣的策略功能
UsernameForCertificateAssertion assertion = new UsernameForCertificateAssertion();
//設置 X509證書到安全斷言.
assertion.X509TokenProvider = new X509TokenProvider(StoreLocation.CurrentUser,
StoreName.AddressBook,
"CN=WSE2QuickStartServer",//證書
X509FindType.FindBySubjectDistinguishedName);
//設置簽名選項。
assertion.Protection.Request.SignatureOptions = SignatureOptions.IncludeAddressing |
SignatureOptions.IncludeTimestamp |
SignatureOptions.IncludeSoapBody;
//加密消息主體
assertion.Protection.Request.EncryptBody = true;
以上就是對WSE3.0配置工具的使用過程的詳細介紹。我們了解了整合WSE3.0配置工具相關的概念和使用方法,以及使用WSE3.0配置工具對具體的項目進行安全設置的實現過程。希望通過本文的介紹,大家能對WSE3.0實現Web服務的安全有個新的了解。基礎知識和概念請參考本系列的前兩節。在調試WSE3.0安全項目的時候遇到的錯誤以及解決辦法我也放到博客的開發常見錯誤解決系列文章裡。
文章來源:http://www.cnblogs.com/frank_xl/archive/
本文配套源碼