2009-08-05 88 views
1

我有一个非常简单的WCF服务,我想公开公开。我创建了这个服务,并且在没有太多麻烦的情况下将其设置在我们的服务器上问题是,我们能够对我们的专用网络内使用的服务,但是当我们尝试从网络外部使用它,下面的错误是抛出:WCF验证问题

安全支持提供程序接口(SSPI)协商失败。

我做了一些研究,听起来像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> 

我将不胜感激一些指针,或在正确的方向轻推。

回答

6

那么,你的服务使用的wsHttpBinding,默认情况下将需要Windows用户凭据 - 这为外部用户显然不会有。它本身不是WCF,默认情况下使用Windows凭据(如您所述),但实际上是这种特定绑定(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与basicHttpBinding的,如果你原来没有好处关闭安全以及wsHttpBinding提供的所有其他更高级功能)。

还有一个非常好的blog post series,在五个不同的,典型的场景方面谈谈WCF安全的基本知识 - 优秀的读!

马克

+0

只是遇到同样的问题,尽管可能没有“没有任何好处”,但为什么有些人可能希望使用wsHttpBinding有一定的区别。 http://stackoverflow.com/questions/2106715/basichttpbinding-vs-wshttpbinding – 2013-08-21 08:50:18

2

WCF可以是一个真正的痛苦,当谈到配置它。看看WCFSecurity它为不同的配置环境提供了很好的工作示例。

+0

看看我在答复中提到的博客文章 - 他们真的有很大的帮助,使WCF安全一样容易采摘的这五个场景之一 - 真! :-) – 2009-08-05 14:56:30

+0

博客文章没问题,但他们只涵盖基本情况。WCF安全指导更加全面,涵盖深入的主题。 – Ray 2009-08-05 15:09:51

+1

嗯,重点是:这些博客文章涵盖了基本的五种情况,涵盖了大约90%的用例。 WCF安全指南涵盖了所有可能的功能组合 - 但是您真的需要这些吗?由于它们覆盖了一切,这是你可能淹没的大量信息..... – 2009-08-05 17:18:35

2

这给你传输级安全性,没有身份验证:

<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 samples

+0

你能告诉我你如何实现没有证书的运输安全吗?这个答案没有意义。 – SomeRandomName 2017-01-23 15:18:24