一些背景知识:
我们正在将相当复杂的网络服务架构迁移到较新的Windows服务器。一些网站/服务已从IIS6移至IIS7,作为其中的一部分。所以新机器,相同的配置,可能是不同版本的IIS。
所有代码都已重新编译(未更改)到VS2012 / .NET 4.0中。 这是C#和VB.NET的混合。
我们有一个具有以下配置的WCF Web服务。
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<extensions>
<behaviorExtensions>
<add name="caller" type="xxx.CallerBehaviorExtensionElement, xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="caller">
<caller />
</behavior>
<clientCredentials>
<serviceCertificate>
<authentication revocationMode="NoCheck" />
</serviceCertificate>
<windows allowedImpersonationLevel="Delegation" />
</clientCredentials>
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="xxxWcfBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="xxxWcfBehavior" name="xxxWcf">
<endpoint address="" behaviorConfiguration="caller" binding="wsHttpBinding" contract="xxxWcf">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
从ASMX Web服务(1)调用此方法可以正常工作。 从ASMX Web服务(2)调用此方法不起作用,返回以下异常:
System.ServiceModel.Security.SecurityNegotiationException:调用者未经过服务身份验证。 ---&GT; System.ServiceModel.FaultException:无法满足安全令牌请求,因为身份验证失败。
这是客户端的web.config:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="caller" type="xxxx.CallerBehaviorExtensionElement, xxx, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</behaviorExtensions>
</extensions>
<behaviors>
<endpointBehaviors>
<behavior name="caller">
<caller />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="xxxDataWcf" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/>
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>
<message clientCredentialType="Windows" negotiateServiceCredential="true" algorithmSuite="Default" establishSecurityContext="true"/>
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="http://xxxDataWcf.svc"
binding="wsHttpBinding" bindingConfiguration="xxxDataWcf"
contract="xxxDataWcf" name="xxxDataWcf">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</client>
</system.serviceModel>
但是(1)和(2)之间的区别是什么?我什么都不会建议。多人比较了IIS配置(这发生在v6和v7之间),比较了web.configs,创建了测试项目和比较权限。
我是否已经破坏了是否包含CallerBehaviorExtensionElement。我确定它不相关但包含它,因为删除它会使配置无效到无益的程度。所有这些都是在不依赖委托/ ASP.NET身份验证的情况下跨越啤酒花传递用户名的作弊。要明确的是,这不会形成授权,也不会与Windows相互作用。授权基础设施以任何方式。我们只是用它来用来电者的用户名标记最终记录。
根据我们之前的调查:
似乎错误的股票反应是削弱安全性,我们不愿意这样做。这在IIS6配置中运行良好,并且在IIS7下的本地开发机器上工作正常(奇怪的是,甚至跨越机器/ OS边界)。所以它原则上有效。
我们正在打击我们的头脑并向社区寻求暗示。如果您需要任何具体信息,请询问。这是WCF,我确定你会发现配置非常嘈杂。
答案 0 :(得分:2)