开发使用安全的METRO 2.1 Web服务的.NET客户端

时间:2011-04-03 12:20:22

标签: java .net wcf jax-ws java-metro-framework

我有一个安全的METRO 2.1 Web服务,我想开发一个可以使用它的.NET(3.5)客户端。如果WS没有安全保护,我已经成功了,但是一旦我得到了

安全机制为Username Authentication with Symmetric Key,并使用Development Defaults

如何在.NET中设置安全性?我一直在阅读METRO指南,但我只找到了与示例相关的链接,指南并没有让我了解。我成功生成了svcutil的代理类,但我不知道如何使用它。

svcutil警告:

  

警告1自定义工具警告:已为端点导入安全策略。安全策略包含无法在Windows Communication Foundation配置中表示的要求。查找有关生成的配置文件中所需的SecurityBindingElement参数的注释。使用代码创建正确的绑定元素。配置文件中的绑定配置不安全。

     

警告2自定义工具警告:wsam:Addressing元素需要一个wsp:Policy子元素,但没有子元素。

修改

我已经非常接近解决这个问题了(我认为)。我使用keytool.exe导出了默认的GlassFish证书:

keytool -exportcert -alias xws-security-server -storepass changeit -keystore keystore.jks -file server.cer 
keytool -printcert -file server.cer //This line shows it's content

我在客户端使用server.cer证书:

KDTreeWSClient wsClient = new KDTreeWSClient();
X509Certificate2 server_cert = new X509Certificate2("FullPathToCertificate/server.cer", "changeit");
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert;
wsClient.ClientCredentials.UserName.UserName = "wsitUser"; //Default GF username
wsClient.ClientCredentials.UserName.Password = "changeit"; //Default GF password

问题这会产生MessageSecurityException,因为端点的预期DNS身份是localhost,但端点有xwssecurityserver。我可以手动将其设置为localhost / xwssecurityserver吗?

任何帮助将不胜感激! 提前致谢, 丹尼尔

3 个答案:

答案 0 :(得分:1)

尝试在客户端应用程序的配置文件中设置DNS身份,如下所述

      <endpoint address="http://localhost:8080/SecureCalculatorApp/CalculatorWSService"
          binding="customBinding" bindingConfiguration="CalculatorWSPortBinding1"
          contract="ServiceReference3.CalculatorWS" name="CalculatorWSPort1">
        <identity>
          <dns value="{YOUR ALIAS}" />
        </identity>
      </endpoint>

由于dns值设置为“xwssecurityserver”。在我的情况下它是有效的(顺便说一下,当我解决这个问题时,我用你的问题作为基础,所以谢谢你指出正确的方法:))

答案 1 :(得分:0)

我实际上并不认为这是您的问题,但它可能有助于解决您遇到的一些工具警告问题。第二条消息看起来很模糊。我们有一个SOAP 1.1客户端与Java WS交谈,它暴露了自定义故障异常。当Java服务出现故障时,它将堆栈跟踪添加到故障中,并且我们的.NET客户端爆炸,因为它不支持多个子元素,只有SOAP 1.2服务。在与我们的Java开发团队交谈之后,他们发现Tomcat中有一个调试设置(或者在Java中我记不清哪个)允许你转向它,因此没有包含堆栈跟踪。之后,故障正确传播。抱歉,不能提供更多帮助,但可能有所帮助。

答案 2 :(得分:0)

这是我配置客户端的方式:

Uri uri = new Uri("http://localhost:8080/JavaWSJMX/KDTreeWSService");
X509Certificate2 server_cert = new X509Certificate2("C:/../server.cer", "changeit"); //Second param is the certificate's password
AddressHeader[] ah = new AddressHeader[0];
EndpointAddress ea = new EndpointAddress(uri, EndpointIdentity.CreateX509CertificateIdentity(server_cert), ah);
KDTreeWSClient wsClient = new KDTreeWSClient("KDTreeWSPort", ea);

KDTreeWSPortendpointConfigurationName的位置,您可以从.config获取<{1}}:

<client>
  <endpoint address="http://localhost:8080/JavaWSJMX/KDTreeWSService"
    binding="customBinding" bindingConfiguration="KDTreeWSPortBinding"
    contract="KDTreeWS" name="KDTreeWSPort" />
</client>

在此之后你必须设置ClientCredentials

//The server uses this certificate
wsClient.ClientCredentials.ServiceCertificate.DefaultCertificate = server_cert;
//These are the default credentials on GlassFish v3.1
wsClient.ClientCredentials.UserName.UserName = "wsitUser";
wsClient.ClientCredentials.UserName.Password = "changeit";

您应该可以拨打METRO网络服务!我使用的是使用svcutil生成的Proxy-class,所以我没有使用ServiceReference