现在这个SOAP消息的头部部分包含了用户名和口令。服务器对用户证书进行验证,或者许可或者拒绝了对目标Web服务的访问。为了防止对口令的窃听,你必须使用消息级的加密或者以前描述的SSL方法。
一个.net2.0客户端也将一个UsernameToken添加到SOAP/HTTP的头部。为了支持这项功能,你必须在你的Visual Studio环境中安装WSE 3.0库及其扩展。(你可从这里下载。)你必须像在Java客户端的例子中所做的那样,从WSDL中生成一个客户端的stub。生成的stub看起来会是如下这样子:
...
public partial class CalculatorServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol {
private System.Threading.SendOrPostCallback multiplyOperationCompleted;
private bool useDefaultCredentialsSetExplicitly;
... |
一旦stub被创建,客户端代码就会展现这个stub,并且指定UsernameToken被发送到服务器。下面的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();
} |
运行客户端代码就会生成所期望的输出结果:Result = 35.0
基于签名的身份验证
UsernameToken身份验证适合于客户端身份基于用户的情况,但是你的Web服务客户端可能是一个并不直接代表一个用户的服务器或者设备。可以考虑这样一种情况:一个处理船舶运载的Web服务通过检查定单的交付日期,将定单发送到适当的运载服务供应商。假定客户端是一个消息驱动的服务器定单应用程序,这个应用程序从一个队列中接收消息,并且通过调用运载和账单处理服务来处理定单。在这种情况下,运载服务的身份验证就必须限制为只能给定单应用程序服务器而不是特定的用户。
验证服务器和设备客户端的一种方法是使用XML签名。客户端使用一个私钥来签署SOAP消息,而Web服务使用相应的公钥来验证这个签名。正如在前面的关于加密的示例中所讨论的那样,必须生成一对公/私钥密码。一个密钥存储通常情况下存储着包含服务器公钥的X509证书。图2显示了基于签名的身份验证顺序:
配置XML签名的Web服务仍然是与特定服务器相关的,因此请参考你的服务器的相关文档。
为客户端增加签名需要与配置加密方式一样配置一个WSS4J处理程序。你可以用以前介绍的configureClientHandlers方法为这个处理程序增加代码:
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方法调用configureSignature的目的是指定处理程序的签名属性。其属性包含要签名的局部消息、签名属性文件的位置以及用于在SOAP报头中指定签名的方法:
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页,当前在第
5页
1 2 3 4 5 6