SOAP Web 服务验证 Headers 问题

SOAP Web Service Auth Headers issue

我目前正在尝试从 Flex 客户端使用 Web 服务,但遇到了一个小问题。该服务读取一个名为 'AuthHeader' 的 SOAP header 作为凭据,它使用以下请求从测试客户端(使用来自 CodePlex 的 Storm)工作:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <AuthHeader xmlns="http://ns.stickykiwi.com/">
      <Username />
      <Password />
    </AuthHeader>
  </soap:Header>
  <soap:Body>
    <Authenticate xmlns="http://ns.stickykiwi.com/" />
  </soap:Body>
</soap:Envelope>

服务 returns 如果凭据正常,则为 true(布尔值),否则为 false。现在,当我从 Flex 调用该服务时,它会发送:

<?xml version="1.0" encoding="utf-8"?>
    <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <SOAP-ENV:Header>
        <ns0:AuthHeader xmlns:ns0="https://stickykiwi01">
            <ns0:Password/>  
            <ns0:Username/>
        </ns0:AuthHeader>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <tns:Authenticate xmlns:tns="http://ns.stickykiwi.com/"/>
    </SOAP-ENV:Body>
    </SOAP-ENV:Envelope>

这个returns,

'System.NullReferenceException: Object reference not set to an instance of an object'

因为某些原因,可能比我视力更好的人最清楚,这两个请求之间存在严重差异,我只是没有看到它。

那么,如何在 Flex 中创建 header?我在 Web 服务定义文件中有这段代码:

    var qname:QName = new QName("https://stickykiwi01","AuthHeader");
    var header:SOAPHeader = new SOAPHeader(qname,{Username:"",Password:""});
    _serviceControl.addHeader(header);

在名为 _Super_AuthenticationServices.as 的文件中。我从网络监视器中提取了 Flex 请求。

有几点需要注意,

  1. 该服务不是我的,但我认为它可以正常工作,因为我可以从另一个客户端成功测试它。
  2. 是的,我知道 SOAP 服务现在已经过时了,我们应该将所有代码转移到 WCF,它正在进行中,最终会被引入内部。
  3. 我们想为该服务使用基本身份验证,但 Flex 不允许我将 HTTP header 添加到 SOAP 请求中,因此无法实现。
  4. 所有这些都是 运行 通过 HTTPS,因为我知道它不安全,因为凭据以纯文本形式传递,一旦我们有了这个 运行ning,我们将传递一个散列字符串(与基本身份验证相同)并且也在服务器上取消哈希,这种方式更容易调试。

感谢您的建议。

编辑

这是服务所期望的,我认为我符合该标准,我根本看不出这里有什么问题。

POST /services/_authentication/authenticationservices.asmx HTTP/1.1
Host: stickykiwi01
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://ns.stickykiwi.com/Authenticate"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
          <AuthHeader xmlns="http://ns.stickykiwi.com/">
              <Username>string</Username>
              <Password>string</Password>
          </AuthHeader>
      </soap:Header>
      <soap:Body>
          <Authenticate xmlns="http://ns.stickykiwi.com/" />
      </soap:Body>
  </soap:Envelope>

不,它有效。

不确定发生了什么,但我没有做任何更改,但今天早上 headers 完全按预期工作,这是请求

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <SOAP-ENV:Header>
      <tns:AuthHeader xmlns:tns="http://ns.stickykiwi.com/">      
          <tns:Username></tns:Username>      
          <tns:Password></tns:Password>
      </tns:AuthHeader>
  </SOAP-ENV:Header>
  <SOAP-ENV:Body>
      <tns:Authenticate xmlns:tns="http://ns.stickykiwi.com/"/>
  </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我能看到的唯一区别是现在所有内容的前缀都是 tns 而不是 ns0。但无论如何,问题已解决,可能是通过魔法。

谢谢