簡體   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