站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题Java 与 .NET 的基于 WS-Security的Web Services集成实现(上)

Java 与 .NET 的基于 WS-Security的Web Services集成实现(上)

摘要: Java 与 .NET 的基于 WS-Security的Web Services集成实现(上)

Web Services开发人员
应具备的知识:
使用过VS.NET2003 +WSE开发过Web Services,会使用Jbuilder9开发简单的java应用程序。
一:内容简介
WS-Security描述通过消息完整性,消息机密性和单独消息认证提供保护质量的SOAP消息传递增强。适用于下列场合:
1. 客户必须能够确定消息来自哪个人并能够证实发送方就是那个发送方声称的发送方。
2. 客户必须能够确定被传送的数据没有篡改。
本文介绍了如何实现基于WS-Security协议的Java客户端程序与 .net的web services的集成调用。
二:平台及工具
操作系统:win2000 server
软件:VS.NET2003+WSE1.0 sp1
Jbuilder9
axis-wsse-1.0(axis实现的ws-security)
三:实现
1. 打开VS.NET2003,新建一个ASP.Net Web Services工程。增加一个名称为SumService的Web Services页面,其核心代码如下:
[SoapRpcMethod(Action="http://www.contoso.com/Rpc",RequestNamespace="http://www.contoso.com/SU",ResponseNamespace="http://www.contoso.com/SU")]
[WebMethod]
public int IntAdd(int a,int b) {
SoapContext requestContext = HttpSoapContext.RequestContext;
if (requestContext == null)
throw new ApplicationException("Only SOAP requests are permitted.");
return a+b ; }
2. 使用WSE Setting Tool 设定此Asp Web Services使用WSE功能,并在“安全”选项栏中添加一个密码提供类(PasswordProvider)用来实现WS-Security的安全认证。同时,选中trace功能用以跟踪此Web Services的接收到请求SOAP信息和返回的SOAP信息。
3. 添加Microsoft.Web.Services 引用,添加一个新的class,命名为PasswordProvider,此类实现了WSE中的IPasswordProvider接口,用来提供WS-Security的用户身份验证功能。其核心代码如下:
public class PasswordProvider : IPasswordProvider {
public PasswordProvider() { //
// TODO: Add constructor logic here // }
public string GetPassword(UsernameToken token) {
if (token.Username == “username”) {
return “password”; }
else {
return "love"; } } }
至此,一个实现了WS-Security中的UsernameToken的Web Services就基本实现了。此时建议使用.net先开发一个客户端进行测试,测试成功后再开发相应的java客户端程序。(如何开发请参见我以前写的关于WSE的文章或到微软MSDN上察看)
作者相关文章: Java 与 .NET 的基于 WS-Security的Web Services集成实现(下)(原作) Java与.NET 的Web Services相互调用(原作) 对WSE使用总结的补充(原作)
对该文的评论 人气:114 szlen(2004-3-14 19:34:43)
ASP.NET+C#写的完整源代码 演示下载地址: http://www.szlon.com http://www.szlen.com
rottenapple(2004-3-12 15:28:38)
补充一点,现在在Apache上有一个开源的项目WSS4J是java的WS-Security实现,不过目前还想还没有版本发布,有兴趣的朋友可以去看看。
Java 与 .NET 的基于 WS-Security的Web Services集成实现(下) rottenapple(原作)
关键字 java .net web services ws-security
Java 与 .NET 的基于 WS-Security的Web Services集成实现(下)
rottenapple
4. 打开Jbuilder9 ,新建一个java 类,命名为TestNetService。并将axis-wsse-1.0的jar包添加到Jbuilder的jdk中(Tools->configions jdks->class tab->add)代码如下:
package MyWebServiceJavaClient;
import java.util.Date;
import java.text.DateFormat;
import org.apache.axis.MessageContext;
import org.apache.axis.message.*;
import org.apache.axis.client.*;
import org.apache.axis.utils.*;
import javax.xml.namespace.QName;
import java.lang.Integer;
import javax.xml.rpc.ParameterMode;
import net.vitale.filippo.axis.handlers.WsseClientHandler;
/**
*

Title:


*

Description:


*

Copyright: Copyright (c) 2004


*

Company:


* @author not attributable
* @version 1.0
*/
public class TestNetService {
static String usernameS = null;
static String passwordS = null;
public TestNetService() { }
public static void main(String[] args) {
try {
Integer i = new Integer(2);
Integer j = new Integer(2);
String endpoint="http://localhost/MyServices/WebServiceTest/SumService.asmx";
Service service = new Service();
Call call = (Call)service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName("http://www.contoso.com/SU","IntAdd"));
call.addParameter("a",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);
call.addParameter("b",org.apache.axis.encoding.XMLType.XSD_DATE,javax.xml.rpc.ParameterMode.IN);
call.setReturnType(org.apache.axis.encoding.XMLType.XSD_INT);
call.setUseSOAPAction(true);
call.setSOAPActionURI("http://www.contoso.com/Rpc");
//add a user token
usernameS =”username”;
passwordS = "love";
call.setUsername(usernameS);
call.setPassword(passwordS);
call.setProperty(WsseClientHandler.PASSWORD_OPTION, WsseClientHandler.PASSWORD_DIGEST_WITH_NONCE);
call.setClientHandlers(new WsseClientHandler(), null);
Integer k = (Integer)call.invoke(new Object[]{i,j});
System.out.println( "result is " + k.toString() + "."); }
catch (org.apache.axis.AxisFault e) {
if (e.getFaultCode().toString() .equals("{http://schemas.xmlsoap.org/ws/2002/07/secext}FailedAuthentication"))
System.err.println("The usernameToken and password aren't right! ");
else {
System.err.println(e.getFaultCode().toString()); } }
catch(Exception e) {
System.err.println(e.toString()) ; } } }
5. 编译并运行这个java程序,执行结果如下:
The username and password aren't right!
可以看到,在Web Services中的PasswordProvider类中,GetPassWord()方法是用来返回相应的密码。在上面的示例中,由于username=”usename”,因此GetPassWord返回”password”,而java传递过来的密码是”love”,因此两者不符合。系统会抛出异常,我们在Java中进行捕获,并显示自己的提示信息。
6. 修改部分Java代码并运行
将passwordS = "love”;替换成passwordS = "password";重新编译运行,结果如下:
result is 4.
这样,可以看到Java客户端发送的用户名和密码在Web Services得到了认证,并执行了IntAdd方法,返回正确的计算结果。至此,一个简单的基于WS-Security的Java 客户端与.Net Web Services的互连就基本实现了。
四:可扩展的地方
1. Java端的用户名,密码是可以从UI界面上得到。
2. Java端的密码传输方式用三种,可以自由选择。
3. Web Service端的密码可以从数据库,AD,文件等处获得。
4. Web Service端的验证错误后的异常信息可以自己制定。
5. 可以使用X.509作为证书,添加第三方数字签名认证(目前asix-wsse1.0没有实现)
6. 有兴趣的朋友可以看看axis-wsse-1.0的源代码,很简单,就一个文件,不过我看起来很费劲,因为调用了很多axis里面的东西,那个我也不熟悉,所以就看不明白,呵呵。
五:不足之处
1.X.509是包含在WS-Security中的,但是目前没有基于java的开源实现。IBM的WebSphere有相应的实现。
2.我个人认为这也是基于Web Services的不同平台间相互调用的一个大的问题就是异常的处理。目前我个人觉得好的方法是纪录到日志中。如果想捕获不同系统提供的异常信息的确是一个困难的事情,不知道谁还有好的方法。我发现在网上介绍Web Services的文章书籍中很少有介绍这方面的东西,也许大家都不熟悉也就不敢乱写了(出了我之外)。
参考:
asix-wsse-1.0:http://sourceforge.net/projects/axis-wsse/
wse1.0:http://msdn.microsoft.com/webservices/building/wse/default.aspx
本人能力有限,希望不要误人子弟,有错误大家及时指出来,或者通过email联系
dlut_chen@hotmail.com(MSN)
↑返回目录
前一篇: Java 语言中的 return 语句
后一篇: Java 应用程序中的按值传递语义