現(xiàn)在這個(gè)SOAP消息的頭部部分包含了用戶名和口令。服務(wù)器對(duì)用戶證書進(jìn)行驗(yàn)證,或者許可或者拒絕了對(duì)目標(biāo)Web服務(wù)的訪問。為了防止對(duì)口令的竊聽,你必須使用消息級(jí)的加密或者以前描述的SSL方法。
一個(gè).net2.0客戶端也將一個(gè)UsernameToken添加到SOAP/HTTP的頭部。為了支持這項(xiàng)功能,你必須在你的Visual Studio環(huán)境中安裝WSE 3.0庫(kù)及其擴(kuò)展。(你可從這里下載。)你必須像在Java客戶端的例子中所做的那樣,從WSDL中生成一個(gè)客戶端的stub。生成的stub看起來(lái)會(huì)是如下這樣子:
...
public partial class CalculatorServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol {
private System.Threading.SendOrPostCallback multiplyOperationCompleted;
private bool useDefaultCredentialsSetExplicitly;
... |
一旦stub被創(chuàng)建,客戶端代碼就會(huì)展現(xiàn)這個(gè)stub,并且指定UsernameToken被發(fā)送到服務(wù)器。下面的c#示例代碼演示了如何做到:
static void Main(string[] args)
{
CalculatorServiceWse calc = new CalculatorServiceWse();
calc.Url = "http://localhost:9080/WSUTSigEncRouterWeb/services/Calculator";
//
UsernameToken token = new UsernameToken("johndoe", "abc123",
PasswordOption.SendPlainText);
calc.SetClientCredential(token);
calc.SetPolicy("usernameTokenSecurity");
float result = calc.multiply(7, 5);
Console.WriteLine("Result = " + result);
Console.ReadLine();
} |
運(yùn)行客戶端代碼就會(huì)生成所期望的輸出結(jié)果:Result = 35.0
基于簽名的身份驗(yàn)證
UsernameToken身份驗(yàn)證適合于客戶端身份基于用戶的情況,但是你的Web服務(wù)客戶端可能是一個(gè)并不直接代表一個(gè)用戶的服務(wù)器或者設(shè)備。可以考慮這樣一種情況:一個(gè)處理船舶運(yùn)載的Web服務(wù)通過檢查定單的交付日期,將定單發(fā)送到適當(dāng)?shù)倪\(yùn)載服務(wù)供應(yīng)商。假定客戶端是一個(gè)消息驅(qū)動(dòng)的服務(wù)器定單應(yīng)用程序,這個(gè)應(yīng)用程序從一個(gè)隊(duì)列中接收消息,并且通過調(diào)用運(yùn)載和賬單處理服務(wù)來(lái)處理定單。在這種情況下,運(yùn)載服務(wù)的身份驗(yàn)證就必須限制為只能給定單應(yīng)用程序服務(wù)器而不是特定的用戶。
驗(yàn)證服務(wù)器和設(shè)備客戶端的一種方法是使用XML簽名?蛻舳耸褂靡粋(gè)私鑰來(lái)簽署SOAP消息,而Web服務(wù)使用相應(yīng)的公鑰來(lái)驗(yàn)證這個(gè)簽名。正如在前面的關(guān)于加密的示例中所討論的那樣,必須生成一對(duì)公/私鑰密碼。一個(gè)密鑰存儲(chǔ)通常情況下存儲(chǔ)著包含服務(wù)器公鑰的X509證書。圖2顯示了基于簽名的身份驗(yàn)證順序:
配置XML簽名的Web服務(wù)仍然是與特定服務(wù)器相關(guān)的,因此請(qǐng)參考你的服務(wù)器的相關(guān)文檔。
為客戶端增加簽名需要與配置加密方式一樣配置一個(gè)WSS4J處理程序。你可以用以前介紹的configureClientHandlers方法為這個(gè)處理程序增加代碼:
private static void configureClientHandlers(Object svc) {
Client client=Client.getInstance(svc);
client.addOutHandler(new DOMOutHandler());
// Add WSS4J signature Handler
Properties sigProps = new Properties();
configureSignature(sigProps);
client.addOutHandler(new WSS4JOutHandler(sigProps));
} |
configureClientHandlers方法調(diào)用configureSignature的目的是指定處理程序的簽名屬性。其屬性包含要簽名的局部消息、簽名屬性文件的位置以及用于在SOAP報(bào)頭中指定簽名的方法:
protected static void configureSignature(Properties config)
{
// Signature Action
config.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.SIGNATURE );
// Method of specifying the signature in the header
config.setProperty(WSHandlerConstants.SIG_KEY_ID, "DirectReference");
// Signature Property File Location
config.setProperty
(WSHandlerConstants.SIG_PROP_FILE, "com/dev/ws/client/driver/outsecurity_sig.properties");
// Sign the Body part of the message
String bodyPart = "{Content}{}Body";
config.setProperty(WSHandlerConstants.SIGNATURE_PARTS,bodyPart);
} |
本新聞共
6頁(yè),當(dāng)前在第
5頁(yè)
1 2 3 4 5 6