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 请求。
有几点需要注意,
- 该服务不是我的,但我认为它可以正常工作,因为我可以从另一个客户端成功测试它。
- 是的,我知道 SOAP 服务现在已经过时了,我们应该将所有代码转移到 WCF,它正在进行中,最终会被引入内部。
- 我们想为该服务使用基本身份验证,但 Flex 不允许我将 HTTP header 添加到 SOAP 请求中,因此无法实现。
- 所有这些都是 运行 通过 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。但无论如何,问题已解决,可能是通过魔法。
谢谢
我目前正在尝试从 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 请求。
有几点需要注意,
- 该服务不是我的,但我认为它可以正常工作,因为我可以从另一个客户端成功测试它。
- 是的,我知道 SOAP 服务现在已经过时了,我们应该将所有代码转移到 WCF,它正在进行中,最终会被引入内部。
- 我们想为该服务使用基本身份验证,但 Flex 不允许我将 HTTP header 添加到 SOAP 请求中,因此无法实现。
- 所有这些都是 运行 通过 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。但无论如何,问题已解决,可能是通过魔法。
谢谢