我在同一个IIS服务器上托管了两个网站。 SiteA包含需要由SiteB访问的WCF服务,以及在域上进行身份验证的任何其他内容。
该服务配置了wsHttpBinding,因此我认为默认情况下使用Windows安全性。现在,我可以从本地计算机上运行的控制台应用程序以及默认Visual Studio Web服务器中运行的Web应用程序调用服务,因此我认为身份验证正在运行。
但是,当SiteB尝试访问服务时,它会失败,并显示以下错误: 呼叫者未通过该服务进行身份验证。
SiteB在与SiteA相同的计算机上运行,因此我不明白为何无法对其进行身份验证。 SiteB使用表单身份验证,我映射了对域用户的匿名访问。
以下是配置位:
SiteA(服务):
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
<services>
<service behaviorConfiguration="wcfServiceBehaviour" name="MyService">
<endpoint address="" binding="wsHttpBinding" contract="IServiceContract" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="wcfServiceBehaviour">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
SiteB(客户端):
<system.serviceModel>
<client>
<endpoint address="http://xxxxx/Services/xxService.svc"
binding="wsHttpBinding"
contract="IServiceContract" />
</client>
</system.serviceModel>
答案 0 :(得分:1)
您是对的 - WCF中配置的wsHttpBinding默认使用Windows身份验证。
这里有一个建议 - WCF - changing endpoint address results in securityexception - Identity块不能用于Windows身份验证 - 尝试删除它。
答案 1 :(得分:1)
当SiteB模仿其他用户时,您的代码是否指定了impersonation level?
我的猜测是你没有指定足够高的假冒程度。 (委派是最高的,允许SiteB将权限传递给其他服务)。
我怀疑修复SiteB模拟代码足以解决问题。
如果没有,请尝试将允许的模拟级别传递给服务器:
<system.serviceModel>
<client>
<endpoint address="http://xxxxx/Services/xxService.svc"
binding="wsHttpBinding"
contract="IServiceContract"
behaviorConfiguration = "ImpersonationBehavior" />
</client>
<behaviors>
<endpointBehaviors>
<behavior name="ImpersonationBehavior">
<clientCredentials>
<windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level -->
</clientCredentials>
</behavior>
<endpointBehaviors>
</behaviors>
</system.serviceModel>
答案 2 :(得分:0)
如果您使用像我这样的自托管站点,避免此问题的方法(如上所述)是在主机和客户端都规定wsHttpBinding安全模式= NONE。
在客户端和主机上创建绑定时,您可以使用以下代码:
Dim binding as System.ServiceModel.WSHttpBinding
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None)
或
System.ServiceModel.WSHttpBinding binding
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);