使用SOAP调用IP21服务器SQLPLusWebService的身份认证问题
你提到调用IP21的SQLPlusWebService时,SOAP请求的schema里没提及用户凭证,但系统要求认证,结合你给出的POST请求信息:
POST /SQLPlusWebService/SQLplusWebService.asmx HTTP/1.1
Host: us1sawn03292
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://www.aspentech.com/SQLplus.WebService/ExecuteSQL"
我之前处理过不少AspenTech IP21的SOAP服务场景,这种情况很常见,给你几个靠谱的解决方向:
HTTP Basic认证(最常用):IP21的Web服务大多支持这种方式,不需要修改SOAP XML体,只要在HTTP请求头里添加
Authorization字段即可。格式是Basic [base64编码的"用户名:密码"]。举个例子:
假设你的用户名是opcuser,密码是ip21pass,先把opcuser:ip21pass转成Base64编码,然后在请求头里加入:Authorization: Basic b3BjdXNlcjppcDIxcGFzcw==像Postman、SoapUI这类工具都有内置的Basic Auth配置项,不用手动编码,直接输入用户名密码就行。
自定义SOAP Header传递凭证:部分IP21部署会要求把凭证放在SOAP Header中,虽然官方schema没标注,但这是AspenTech的常见扩展。你可以尝试在SOAP Envelope里添加如下结构的Header:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sql="http://www.aspentech.com/SQLplus.WebService"> <soap:Header> <sql:AuthenticationHeader> <sql:Username>你的用户名</sql:Username> <sql:Password>你的密码</sql:Password> </sql:AuthenticationHeader> </soap:Header> <soap:Body> <sql:ExecuteSQL> <!-- 这里放你的SQL参数 --> <sql:sqlString>SELECT * FROM YOUR_TAG</sql:sqlString> </sql:ExecuteSQL> </soap:Body> </soap:Envelope>如果这个Header结构不生效,建议联系IP21系统管理员确认具体的Header命名空间和字段名。
Windows集成认证(NTLM/Kerberos):如果你的IP21服务器加入了Windows域,可能支持用域用户身份认证。这种情况下,你可以直接使用当前登录用户的凭证,或者在SOAP客户端里指定域用户名和密码(格式一般是
域名\用户名)。比如在.NET的HttpClient里,可以通过HttpClientHandler的Credentials属性配置NTLM认证。
另外,你可以先通过访问http://us1sawn03292/SQLPlusWebService/SQLplusWebService.asmx?wsdl获取完整的WSDL,导入到SoapUI里测试不同的认证方式,这样能快速定位哪种方式适合你的系统。
内容的提问来源于stack exchange,提问作者Spladel

