문제

공개적으로 노출하고 싶은 매우 간단한 WCF 서비스가 있습니다. 서비스를 만들어 많은 번거 로움없이 서버를 통해 설정했습니다. 문제는 개인 네트워크 내에서 서비스를 사용할 수 있지만 네트워크 외부에서 서비스를 사용하려고 할 때 다음 오류가 발생한다는 것입니다.

SSPI (Security Support Provider Interface) 협상에 실패했습니다.

약간의 연구를 수행했으며 WCF가 기본적으로 Windows 인증을 사용하는 것처럼 들립니다. 인증을 사용하지 않도록 변경하고 싶지만 어떻게 확실하지는 않습니다. 내 구성이 지금 어떻게 보이는지는 다음과 같습니다.

<system.serviceModel>
    <services>
        <service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
         name="XX.ZZ.WebService.MyService">
            <endpoint  address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="XX.ZZ.WebService.MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

나는 올바른 방향으로 약간의 포인터 나 멍청이에 감사 할 것입니다.

도움이 되었습니까?

해결책

글쎄, 귀하의 서비스는 WSHTTPBinding을 사용합니다. WSHTTPBinding은 기본적으로 Windows 사용자 자격 증명이 필요합니다. 기본적으로 Windows 자격 증명을 사용하는 것은 WCF 자체가 아니지만 실제로이 특정 바인딩 (WSHTTPBinding) - 다른 바인딩 (WSHTTPBinding)은 다른 설정에 기본값을받을 수 있습니다.

몇 가지 선택이 있습니다.

  • 보안을 전혀 사용하지 않도록 WSHTTPBINDING ( "무거운 중량")를 구성하거나 발신자가 제공 해야하는 사용자 이름/비밀번호 보안을 사용하십시오.
  • 대신 보안이없는 BasichttpBinding을 사용하십시오 (기본적으로 ASMX 모델입니다)

wshttpbinding에서 보안을 완전히 끄려면 구성 에이 정보를 포함시킵니다.

<bindings>
  <wsHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

그런 다음 해당 바인딩 구성을 사용하도록 엔드 포인트를 구성하십시오.

<system.serviceModel>
    <services>
        <service name="XX.ZZ.WebService.MyService"
                 behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
           <endpoint address="" 
                     binding="wsHttpBinding" 
                     bindingConfiguration="NoSecurity" 
                     contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>

당신은 똑같이 할 수 있습니다 <basicHttpBinding> 대신에 <wsHttpBinding> 원하는 경우 (WSHTTPBinding vs. BasichttpBinding을 사용하는 데 도움이되는 이점이 없습니다. 보안 및 WSHTTPBinding이 제공하는 다른 모든 고급 기능을 끄면).

정말 좋은 것도 있습니다 블로그 게시물 시리즈 그것은 5 가지, 전형적인 시나리오 - 우수한 읽기!

마크

다른 팁

이를 통해 인증없이 운송 수준 보안을 제공합니다.

<configuration>  <system.serviceModel>
    <services>
      <service 
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1" 
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>  </system.serviceModel>
</configuration>

다른 시나리오의 경우 Microsoft WCF 샘플.

WCF는 구성과 관련하여 진정한 고통이 될 수 있습니다. 보세요 wcfsecurity 다양한 구성 환경에 적합한 작업 샘플을 제공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top