“仅在域上的计算机上使用customBinding时,”调用程序未通过服务进行身份验证“

时间:2011-02-25 17:48:34

标签: wcf wcf-binding wcf-security

我在不属于域的服务器上编写了由IIS 6托管的WCF服务。它使用以下配置:

<system.serviceModel>
  <services>
    <service behaviorConfiguration="ServiceBehavior" name="Services.DeliveryStatsService">
      <endpoint address="" binding="customBinding" bindingConfiguration="BindingWithMaxClockSkewForIncorrectlyConfiguredWindowsServer"
        contract="Services.IDeliveryStatsService" />
    </service>
  </services>

  <bindings>
    <customBinding>
      <binding name="BindingWithMaxClockSkewForIncorrectlyConfiguredWindowsServer">
        <binaryMessageEncoding />
        <security>
          <localClientSettings maxClockSkew="00:20:00" />
          <localServiceSettings maxClockSkew="00:20:00" />
          <secureConversationBootstrap />
        </security>
        <httpTransport />
      </binding>
    </customBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceBehavior">
        <serviceMetadata httpGetEnabled="false" />
        <serviceDebug includeExceptionDetailInFaults="true" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

这将是一个简单的basicHttpBinding,除了服务器的时钟未设置到正确的时间且其管理员不会更改它,因此需要customBinding来允许“clockSkew 。“

客户端使用几乎相同的配置(绑定方式)并且可以毫无困难地访问服务,只要它们不是域的一部分。但是,属于域的客户端将被拒绝,并显示消息“调用者未通过服务进行身份验证。”

我开启了跟踪,似乎问题来自使用SSPI协商的令牌交换。不幸的是,我似乎找不到合适的配置,允许不属于域的机器和属于域的机器访问该服务。我为authenticationMode尝试了几个值,但没有用。更重要的是,就我而言,我对这项服务不需要任何特别的安全保障。

WCF配置远非我的专业,我在其他地方找不到答案,所以我希望Stack Overflow的人能够提供帮助。提前谢谢。

1 个答案:

答案 0 :(得分:1)

为什么在不需要安全性时需要设置maxClockSkew?它用于处理时间戳的时间差异,这些时间差在没有安全性的情况下不会发送。添加security元素后,您将启用身份验证,因为元素中的所有属性都具有默认值。模式的默认值为sspiNegotiated。我将从删除security元素开始。