Asp.net 如何为我的场景强制进行soap头身份验证?

Asp.net 如何为我的场景强制进行soap头身份验证?,asp.net,web-services,authentication,soap,wsdl,Asp.net,Web Services,Authentication,Soap,Wsdl,问题是:我需要连接到soapweb服务;由java代码生成;通过C#通过MS Visual Studio 2013使用ASP.Net客户端 尝试1,通常的方法: 我使用wsdl并通过分配凭据添加了一个web服务引用,如: Credentials.Username.Username = "test"; Credentials.Password.Password = "test"; 执行时,遇到以下异常: The login information is

问题是:我需要连接到soapweb服务;由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:

我搜索过类似的问题,如:

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

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

尝试3: 我已尝试在client web.config中更改服务模型:

  <bindings>
      <basicHttpBinding>
        <binding name="CallingCardServicePortBinding">
          <security mode="TransportWithMessageCredential" >
            <message clientCredentialType="UserName"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
所以,现在我不知道该怎么办! 我无法控制web服务,我需要构建一个理解它的客户端

救命啊

Soap请求模板如下所示:

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

someUserName
密码
.......
.......
.......

如果目标web服务使用身份验证,则仅ASMX不起作用,因为它不知道身份验证、加密等。您有2个选项:

  • 使用Microsoft WSE:
  • 这只是ASMX的一个扩展,使其具有安全/加密意识。(和其他一些特性)从技术上讲,您将添加对WSE DLL的引用,并且您的Soap代理将从WSE Soap客户端而不是系统客户端进行扩展

    完成此操作后,代理类将具有其他用户名/密码属性,您可以使用这些属性进行正确的身份验证

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

  • 另一种选择(首选)是使用WCF ASMX和WSE比WCF旧。WCF试图将所有web服务的细微差别放在一个屋檐下。如果您获得WCF服务引用,它(svcutil.exe)将自动为您创建代理类和正确的绑定。(大部分是习俗)

    完成此操作后,请尝试设置用户名和密码

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

    e、 g

    
    someUserName
    密码
    
    不要使用wsdl.exe。它是旧ASMX技术堆栈的一部分。ASMX是一种遗留技术,不应用于新的开发。WCF或ASP.NET Web API应用于Web服务客户端和服务器的所有新开发。一个提示:微软已经在MSDN上退出了。
    <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>
    
    <client>
     <endpoint>
      <headers>
        <credentials>
            <userName>someUserName</userName>
            <password>somePassword</password>
         </credentials> 
      </headers>
     </endpoint>
    </client>