【问题标题】:Impersonation failing for database connection数据库连接模拟失败
【发布时间】:2011-08-23 02:53:57
【问题描述】:

我有一个使用 WCF 与后端 SQL Server 2008 数据库通信的 SL4 应用程序。由于调用的存储过程所需的数据库权限,其中一项 WCF 服务需要使用专用系统帐户连接到数据库。我试图在服务代码中使用模拟来实现解决方案,例如

int result = LogonUser(userName, domain, password,
    LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, out _token);

if (result > 0)
{
    ImpersonateLoggedOnUser(_token);
    //Code here to call NHibernate data access code
}

我的这个服务的连接字符串是:

<add name="MyConnection" connectionString="Data Source=servername\instance;Initial Catalog=MyDatabase;Integrated Security=SSPI" providerName="System.Data.SqlClient"/>

但是,数据访问例程仍然失败并显示以下消息:

用户“NT AUTHORITY\ANONYMOUS LOGON”登录失败。

在数据库连接中忽略了模拟。有什么想法吗?

【问题讨论】:

  • 您应该始终检查 ImpersonateLoggedOnUser 的返回值。仅当调用成功时,您才应该运行旨在在模拟上下文中运行的代码。如果调用失败,错误代码 (new Win32Exception().NativeErrorCode) 会告诉您原因。您还应该在模拟代码周围有一个 try 块,并始终在 finally 块中调用 RevertToSelf。
  • 我拥有这一切。我保持我的代码示例简短只是为了解决主要问题。无论如何,谢谢。
  • 你能把我的答案取消标记为答案吗?我想我没有正确阅读这个问题。对不起。
  • @Aliostad - 完成。抱歉,如果对这个问题有任何混淆。我想做的就是使用固定域帐户从 WCF 服务中访问我们的数据库。下面列出的我的解决方案现在工作正常。

标签: sql-server wcf silverlight-4.0 wcf-security impersonation


【解决方案1】:

我实际上已经设法通过摆脱模拟 API 代码并将以下内容添加到我的 web.config 中来使其工作:

  <location path="Services/MyServiceThatNeedsHigherPermissions.svc">
    <system.web>
      <identity impersonate="true" userName="domain\MyAccountWithElevatedPermissions" password="******"/>
    </system.web>
  </location>

该服务在我的专用系统帐户的上下文中运行,并使用相同的上下文连接到 SQL。

【讨论】:

  • 但这并不是真的冒充任何人,它是作为您指定的特定帐户运行的。
  • 好的,但这是我一直在寻找的最终结果。
  • OP 希望用户使用他们自己的凭据对 sql server 进行身份验证,因此所有的模拟传奇......这是设置一个固定帐户。
  • @alostad:不,正如他在问题中所说,OP 想使用固定帐户访问数据库。
  • @Chris 你是对的。问题好像变了!
【解决方案2】:

在您对LogonUser 的呼叫中将LOGON32_LOGON_NETWORK 更改为LOGON32_LOGON_NETWORK_CLEARTEXT

这会将登录凭据缓存在本地安全提供程序中,这应该会启用与 SQL Server 的成功 SSPI 握手。

【讨论】:

    猜你喜欢
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 2017-06-12
    • 2023-03-02
    • 2020-05-05
    • 2011-12-05
    相关资源
    最近更新 更多