配置WCF安全性(wsHttpBinding)

时间:2010-11-29 01:21:28

标签: wcf wcf-binding windows-authentication

我在同一个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>

3 个答案:

答案 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);