在WCF服务中使用Impersonation时,SQL登录失败

时间:2011-10-20 22:31:56

标签: wcf

我有一个WCF服务托管在Windows服务中,并且是从Windows窗体应用程序调用的。我正在使用Windows身份验证和模拟。假冒正在发挥作用;但是,当我尝试使用集成安全性访问SQL服务器时,我得到“用户登录失败”。 “。在控制台应用程序中托管服务时,我也得到相同的结果。如果我使用SQL安全性,一切正常。

这是我的服务配置文件。

<system.serviceModel>
<bindings>
  <wsHttpBinding>
    <binding name="WSHttpBinding_IService">
      <security mode="Message">
        <transport clientCredentialType="Windows"
                   proxyCredentialType="None" realm="" />
        <message clientCredentialType="Windows"
                 negotiateServiceCredential="true"
                 algorithmSuite="Default"
                 establishSecurityContext="true" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
  <behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
    <serviceAuthorization impersonateCallerForAllOperations="true" />
  </behavior>
  </serviceBehaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehavior">
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service behaviorConfiguration="ServiceBehavior" name="AfsNetService">
    <endpoint address="" binding="wsHttpBinding" contract="IAfsNetService">
      <identity>
        <userPrincipalName value="user@doman.com" />
        <servicePrincipalName value="localhost" />
        <!--<dns value="" />-->
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>
</services>

对此有任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

这不是WCF问题,而是网络上的计算机之间进行身份验证的基本结果。这是classic "double hop" authentication issue。通常无法对托管服务的服务器与数据库服务器之间的第二跳进行委派身份验证,除非所有身份验证都使用Kerberos,并且已专门配置委派。

如果所涉及的所有计算机(即运行WinForms应用程序的工作站,托管服务的服务器和数据库服务器)都支持Kerberos身份验证而不回退到NTLM,则此方案只能起作用。

如果您确定所有身份验证都使用Kerberos,则必须确保正确配置了委派。 This checklist可能会有所帮助,尽管其中一些与IIS是中间层服务器有关,而不是像您所拥有的自定义服务。

答案 1 :(得分:1)

我不确定这是否能解决您的问题,但似乎您的xml配置缺少 bindingConfiguration 标记。我认为应该是这样的:

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService"/>