在 C# 中使用带有 SSL (https) 的 Web 服务
本文关键字:https 服务 Web SSL | 更新日期: 2023-09-27 18:33:20
我想在 C# 中使用一个 ssl 安全的 Web 服务。请求如下所示:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:biw="http://tempuri.org/ws_returnTable"
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"
>
<soapenv:Header>
<wsse:Security>
<wsse:UsernameToken>
<wsse:Username>sasdemo</wsse:Username>
<wsse:Password>sasch.111</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<biw:meansclass />
</soapenv:Body>
</soapenv:Envelope>
WSDL 中的端点声明如下所示:
<wsdl:service name="meansclass">
<wsdl:port binding="tns:meansclassSoapBinding" name="meansclassPort">
<soap:address location="https://sas.ssz.intra.stzh.ch:8443/SASBIWS/services/Shared%20Data/ws/meansclass" />
</wsdl:port>
</wsdl:service>
app.config 看起来像这样:
<bindings>
<basicHttpBinding>
<binding name="meansclassSoapBinding" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://localhost:8443/SASBIWS/services/Shared%20Data/ws/meansclass"
binding="basicHttpBinding" bindingConfiguration="meansclassSoapBinding"
contract="ServiceReference1.meansclassPortType" name="meansclassPort" />
</client>
我尝试使用该 C# 代码访问 Web 服务:
var service = new meansclassPortTypeClient();
service.ClientCredentials.UserName.UserName = "username";
service.ClientCredentials.UserName.Password = "password";
var test = service.meansclass();
但是总是有一个由 meansclass(( 抛出的异常。在德语中,它说:
我类型为"客户端身份验证"的异常 (...(没有安全上下文。
用谷歌搜索了很多,但没有发现我做错了什么。如何制作这样的"安全上下文"?还是怎么了?
如果没有额外的上下文(WSDL 的视图(,我正在掌握,但您可能将 SSL 安全性与 Web 服务安全性混淆了,并且该服务正在抱怨 SOAP 标头中的意外凭据。
SSL 安全性作为传输 Web 服务请求和响应过程的一部分应用。 协调 SSL 交互的要求是客户端通过将证书拉取到 C# 使用的信任存储区来信任服务器的证书。
请求中显示的是"消息级别"wss(Web 服务安全性(用户名/密码凭据。
建议:
- 如果可以控制服务实现,请确保从 Web 服务中删除任何安全策略。 如果没有,并且您不能绝对确定服务使用需要用户名和密码,请从 SOAP 标头中删除用户名和密码。
- 同样,如果您可以控制服务实现,请尝试删除 SSL 要求并执行该服务以确定是否可以通过不安全 (http( 连接调用该服务。
- 仅添加回SSL并检查异常...请记住,运行 C# 的上下文必须信任服务器的公共证书。 通常可以通过在浏览器中访问 Web 服务 (https( 地址并使用浏览器的机制将证书保存到相应的信任存储区 (http://balajiramesh.wordpress.com/2007/12/28/save-ssl-certificate-to-cer-file/( 来获取证书