2012-05-07 7 views
2

C#에서 ssl 보안 웹 서비스를 사용하려고합니다. 요청은 다음과 같습니다C#에서 SSL (https)을 사용하여 웹 서비스 사용하기

<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의 엔드 포인트 선언은 다음과 같습니다

의 app.config는 다음과 같습니다
<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> 

:

<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# 코드의 서비스 :

var service = new meansclassPortTypeClient(); 

service.ClientCredentials.UserName.UserName = "username"; 
service.ClientCredentials.UserName.Password = "password"; 

var test = service.meansclass(); 

그러나 반드시 meansclass()에 의해 예외가 throw됩니다. 독일어의 경우 :

'클라이언트 인증'(...) 유형의 예외 보안 컨텍스트가 없습니다.

나는 많은 것을 봤지만 내가 잘못한 것을 발견하지 못했습니다. 그러한 "보안 컨텍스트"를 어떻게 만들 수 있습니까? 또는 무엇이 잘못 되었습니까?

+0

답변

0

추가 컨텍스트 (WSDL보기) 없이는 파악하고 있지만 웹 서비스 보안과 SSL 보안을 혼동하고 서비스가 SOAP 헤더의 예기치 않은 자격 증명에 대해 불평 할 가능성이 있습니다.

SSL 보안은 웹 서비스 요청 및 응답을 전송하는 과정의 일부로 적용됩니다. SSL 상호 작용을 조정하는 요구 사항은 C#에서 사용되는 트러스트 스토어로 인증서를 가져 와서 클라이언트가 서버의 인증서를 신뢰하는 것입니다.

요청에 표시된 내용은 '메시지 수준'wss (웹 서비스 보안) 사용자 이름/암호 자격 증명입니다.

제안 : 당신이 서비스 구현의 제어가있는 경우

  1. , 보안 정책이 웹 서비스에서 제거되었는지 확인합니다. 그렇지 않은 경우 사용자 이름과 비밀번호가 서비스 소비에 필요하다는 것을 확신하지 못하는 경우 비누 헤더에서 사용자 이름과 비밀번호를 제거하십시오.
  2. 서비스 구현을 제어 할 수있는 경우 SSL 요구 사항을 제거하고 서비스를 실행하여 보안되지 않은 (http) 연결을 통해 서비스를 호출 할 수 있는지 확인하십시오.
  3. SSL로 다시 추가하고 예외를 확인하십시오 ... 서버에 대한 공용 인증서가 C#이 실행되는 컨텍스트에서 신뢰되어야한다는 것을 기억하십시오. 일반적으로 인증서는 브라우저의 웹 서비스 (https) 주소를 방문하여 브라우저의 메커니즘을 사용하여 인증서를 적절한 트러스트 스토어에 저장합니다 (http://balajiramesh.wordpress.com/2007/12/28/save-ssl-certificate-to-cer-file/)
+0

또한 SSL 및 메시지 보안 기능이 있습니다. – user1379434