我在不属于域的服务器上编写了由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的人能够提供帮助。提前谢谢。
答案 0 :(得分:1)
为什么在不需要安全性时需要设置maxClockSkew
?它用于处理时间戳的时间差异,这些时间差在没有安全性的情况下不会发送。添加security
元素后,您将启用身份验证,因为元素中的所有属性都具有默认值。模式的默认值为sspiNegotiated
。我将从删除security
元素开始。