代码之家  ›  专栏  ›  技术社区  ›  Xavier Poinas

配置WCF安全性(wsHttpBinding)

  •  2
  • Xavier Poinas  · 技术社区  · 14 年前

    我有两个网站托管在同一个IIS服务器上。SiteA包含需要由SiteB访问的WCF服务,以及在域上经过身份验证的任何其他服务。

    该服务配置了wsHttpBinding,因此我认为默认情况下使用Windows安全性。现在,我可以从本地计算机上运行的控制台应用程序以及在默认Visual Studio web服务器上运行的web应用程序调用服务,因此我认为身份验证正在工作。

    但是,当SiteB尝试访问服务时,它将失败,并出现以下错误: 调用方未通过服务身份验证。

    SiteB与SiteA运行在同一台计算机上,所以我不明白为什么它不能被验证。SiteB使用表单身份验证,我将匿名访问映射到域用户。

    以下是配置位:

    站点A(服务):

    <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>
    

    站点B(客户端):

    <system.serviceModel>
        <client>
          <endpoint address="http://xxxxx/Services/xxService.svc"
                    binding="wsHttpBinding"
                    contract="IServiceContract" />
        </client>
    </system.serviceModel>
    
    3 回复  |  直到 14 年前
        1
  •  1
  •   Community gkalpak    7 年前

    您是正确的-在WCF中配置的wsHttpBinding将默认使用Windows身份验证。

    这里有个建议- WCF - changing endpoint address results in securityexception -标识块无法与Windows身份验证一起使用-请尝试删除它。

        2
  •  1
  •   Andrew Shepherd    14 年前

    当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>
    
        3
  •  0
  •   Brian    11 年前

    如果您使用的是像我这样的自托管站点,避免此问题的方法(如上所述)是在主机和客户端上都规定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);