如何强制我的方案的soap标头身份验证?

时间:2014-08-03 09:09:02

标签: asp.net web-services authentication soap wsdl

问题是:我需要连接到肥皂网服务;由java代码生成;通过C#到MS Visual Studio 2013使用ASP.Net客户端。

尝试1,通常的方式:

我使用wsdl添加了一个Web服务引用,并分配了以下凭据:

Credentials.Username.Username = "test";
Credentials.Password.Password = "test";

执行时,遇到以下异常:

                      The login information is missing!

尝试2:

我搜索过类似的问题:

how-to-go-from-wsdl-soap-request-envelope-in-c-sharp

Dynamic-Proxy-Creation-Using-C-Emit

c# - Client to send SOAP request and received response

我选择使用wsdl工具生成代理类,然后添加了 header属性,但我从Microsoft找到了以下注释:

注意:如果Web服务定义了表示SoapHeader或SoapUnknownHeader类型的SOAP头的成员变量,而不是从SoapHeader派生的类,则代理类将不具有关于该SOAP头的任何信息。

尝试3: 我试图在客户端web.config中更改服务模型:

  <bindings>
      <basicHttpBinding>
        <binding name="CallingCardServicePortBinding">
          <security mode="TransportWithMessageCredential" >
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>

然后添加了第一次尝试的凭据,但出现以下错误:

MustUnderstand headers:[{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd}Security] are not understood 

所以,现在我不知道该怎么做! 我无法控制Web服务,我需要构建一个理解它的客户端。

请帮助!

Soap Request模板如下:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="...">
   <soapenv:Header>
    <credentials>
        <userName>someUserName</userName>
        <password>somePassword</password>
     </credentials> 
   </soapenv:Header>
   <soapenv:Body>
      <ser:someRequest>
         .......
         .......
         .......
      </ser:someRequest>

1 个答案:

答案 0 :(得分:1)

如果目标Web服务使用身份验证,那么只有ASMX不会这样做,因为它不知道身份验证,加密等。您有2个选项:

  1. 使用Microsoft WSE:http://www.microsoft.com/en-us/download/details.aspx?id=14089
  2. 这只是ASMX的扩展,使其能够识别安全/加密。 (以及一些其他功能)从技术上讲,您将添加对WSE DLL的引用,您的Soap代理将从WSE SOAP客户端而不是系统客户端扩展。

    一旦这样做,代理类将具有可用于正确验证的其他用户名/密码属性。

    设置属性并使用fiddler查看传出请求。如果标题不是您想要的(因为名称空间等),那么您可以编写自定义的外发消息检查器并很好地修改soap请求。

    1. 另一个选项(首选)是使用WCF。
    2. ASMX和WSE比WCF旧。 WCF试图将所有Web服务细微差别集中在一个屋檐下。如果你得到一个WCF服务引用,它(svcutil.exe)将自动为你创建代理类和正确的绑定。 (主要是定制)

      一旦这样做,请尝试设置用户名和密码。

      如果这不起作用(我经常努力为需要用户名/密码身份验证的基于远程java的服务生成正确的soap标头),您可以在web.config / app中定义静态标头块.config,将作为每个请求的一部分发送。

      e.g。

      <client>
       <endpoint>
        <headers>
          <credentials>
              <userName>someUserName</userName>
              <password>somePassword</password>
           </credentials> 
        </headers>
       </endpoint>
      </client>