Skip to main content
 首页 » 编程设计

c#之在 C# 中使用 SSL (https) 使用 Web 服务

2024年01月02日43kerrycode

我想使用 C# 中的 ssl 安全网络服务。请求看起来像这样:

<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()总是抛出异常。在德语中它说:

Exception of type 'Client Authentication' (...) There is no security context.

我用谷歌搜索了很多,但没有发现我做错了什么。我怎样才能制作这样的“安全上下文”?或者哪里出了问题?

请您参考如下方法:

在没有其他上下文(WSDL View )的情况下,我正在掌握,但您可能混淆了 SSL 安全性和 Web 服务安全性,并且该服务提示 SOAP header 中的意外凭据。

SSL 安全性作为传输 Web 服务请求和响应过程的一部分应用。协调 SSL 交互的要求是客户端通过将证书拉入 C# 使用的信任库来信任服务器证书。

请求中显示的是“消息级别”wss(网络服务安全)用户名/密码凭证。

建议:

  1. 如果您可以控制服务实现,请确保从网络服务中删除所有安全政策。如果您不这样做,并且您不确定服务消费是否需要用户名和密码,请从 soap header 中删除用户名和密码。
  2. 同样,如果您可以控制服务实现,请尝试删除 SSL 要求并运行该服务以确定是否可以通过不安全 (http) 连接调用该服务。
  3. 仅添加回 SSL 并检查异常...请记住,服务器的公共(public)证书必须受到运行 C# 的上下文的信任。通常可以通过在浏览器中访问 Web 服务 (https) 地址并使用浏览器的机制将证书保存到适当的信任库 (http://balajiramesh.wordpress.com/2007/12/28/save-ssl-certificate-to-cer-file/) 中来获取证书