繁体   English   中英

在soap消息中使用wsse安全标头(Visual Studio 2015,.Net Framework 4.5)

[英]Use wsse security header in soap message (Visual Studio 2015, .Net Framework 4.5)

我想使用DHL提供的肥皂服务。 你可以在这里找到wsdl: https//wsbexpress.dhl.com/sndpt/expressRateBook?WSDL

因此,我在Visual Studio 2015中创建了一个新的ClassLibrary,目标是.net framework 4.5。

然后,我通过提供wsdl地址为创建的项目添加了Web引用。 我生成了一个包含所有类型和端口的代理文件,但我的第一个问题是,生成的Service扩展自System.Web.Services.Protocols.SoapHttpClientProtocol 正如我在最近的帖子中读到的那样,不可能将wsse标头带到该代理。 一些帖子建议添加wse但似乎wse不受新版Visual Studio版本的支持。

我尝试通过svcutil生成我的代理。 之后,我将生成的.cs文件添加到项目中,并将生成的配置文件的内容复制到app.config。 (因为我删除了Web引用)现在Service类扩展了System.ServiceModel.ClientBase (我认为VS中的生成器在内部使用svctool。如果microsoft希望人们使用wcf,为什么生成器会生成非wcf代理文件。

我还创建了一个nunit testproject,它应该测试我的服务,但是如果我使用带有svcutil生成版本的版本,我会收到一个错误。 因为错误以德语显示,我尝试将其翻译为英语:

找不到指向服务合同的默认端点元素。 我发现这是因为代理在它自己的类库中,因此没有真正的app.config。 但我的测试项目也是一个类库。

这些天消费需要ws安全用户名/密码的Web服务的实际方法是什么?


您可以在兼容模式下添加Web引用(我猜您正在这样做)。 如果未在兼容模式下添加引用,请执行以下操作:

右键单击引用添加服务引用 - >高级 - >添加Web引用(在兼容性部分下面),键入WS的URL并添加引用。

WSE2.0扩展可在以下位置以Nuget包的形式提供:

https://www.nuget.org/packages/Microsoft.Web.Services2/

在运行以下nugget命令的程序包管理器控制台上安装nuget程序包:Install-Package Microsoft.Web.Services2

安装nuget包后,您需要确保您的项目引用以下DLL:

  1. 的System.Web
  2. System.Web.Services
  3. Microsoft.Web.Services2(这将在安装nuget包后添加)

为了使用WSE2.0扩展,您需要实际修改在添加WebReference时从“Microsoft.Web.Services2.WebServicesClientProtocol”而不是“System.Web.Services.Protocols.SoapHttpClientProtocol”继承时创建的Proxy类。 ”。 请注意,如果更新WebReference,Proxy类将再次从SoapHttpClientProtocol继承。

将以下using子句添加到使用Proxy类的代码中:

using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Security;
using Microsoft.Web.Services2.Security.Tokens;

进行此更改后,您的代码应如下所示:

var token = new UsernameToken("theUser", "thePassword", PasswordOption.SendHashed);

var serviceProxy = new ExpressRateBook.gblExpressRateBook();
SoapContext requestContext = serviceProxy.RequestSoapContext;
requestContext.Security.Timestamp.TtlInSeconds = 60;
requestContext.Security.Tokens.Add(token);
//The rest of the logic goes here...

我在下面添加了屏幕截图供您参考:

在此输入图像描述

注意:我无法测试代码,因为我不熟悉您需要使用的实际方法,显示的代码只是我在代理类中看到的示例,根据您的需要进行更新。 如果您按照之前描述的步骤操作它应该可以正常工作。 请查看以下链接以获取更多详细说明:

https://msdn.microsoft.com/en-us/library/ms819938.aspx

您可以配置服务引用以添加安全标头,如AW Rowse在http://cxdeveloper.com/article/implementing-ws-security-digest-password-nonce-net-40-wcf中所述

 private void Configure()
    {
        System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };

        defaultBinding = new BasicHttpBinding
        {
            Security =
            {
                Mode = BasicHttpSecurityMode.Transport,
                Transport =
                {
                    ClientCredentialType = HttpClientCredentialType.Digest
                }
            }
        };

        defaultToken = new UsernameToken(UserName, Password, PasswordOption.SendHashed);

        defaultSecurityHeader = MessageHeader.CreateHeader(
          "Security",
          "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd",
          defaultToken.GetXml(new XmlDocument())
        );
    }

并创建这样的客户端/代理:

public consulta_informacao_respttClient CriaConsultaClinicaClient()
    {
        var client = new consulta_informacao_respttClient(defaultBinding, new EndpointAddress("https://resqa.homologacao.unimed.coop.br/chs-integration-external-services-ptu-clinical/proxy-services/execute-query/execute-query-proxy-service"));
        client.ClientCredentials.UserName.UserName = UserName;
        client.ClientCredentials.UserName.Password = Password;

        var scope = new OperationContextScope(client.InnerChannel);

        OperationContext.Current.OutgoingMessageHeaders.Add(defaultSecurityHeader);
        return client;
    }

您需要在班级中创建的属性是:

private BasicHttpBinding defaultBinding;
private UsernameToken defaultToken;
private MessageHeader defaultSecurityHeader;

您无需在app / web.config中配置任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM