在 WCF 服务中使用模拟时 SQL 登录失败

Posted

技术标签:

【中文标题】在 WCF 服务中使用模拟时 SQL 登录失败【英文标题】:SQL login failes when using Impersonation inside a WCF service 【发布时间】:2011-10-20 22:31:55 【问题描述】:

我有一个托管在 Windows 服务中的 WCF 服务,并且正在从 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>

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

【问题讨论】:

【参考方案1】:

这不是 WCF 问题,而是网络上机器之间的身份验证方式的基本结果。它是classic "double hop" authentication issue。托管服务的服务器和数据库服务器之间的第二跳的委托身份验证通常是不可能的,除非所有身份验证都使用 Kerberos,并且专门配置了委托。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于在 WCF 服务中使用模拟时 SQL 登录失败的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server由于登录失败无法启动服务

SQL Server 服务由于登录失败而无法启动怎么办

SQL SERVER 2012 新增数据库显示登录失败

Oracle Pl sql 登录时提示 “监听程序当前无法识别连接描述符中请求的服务” 。

sql windows登录失败怎么办

Angularjs应用程序没有响应Wcf REST服务