模拟调用者阻止连接到数据库(不是明显的权限问题)

Posted

技术标签:

【中文标题】模拟调用者阻止连接到数据库(不是明显的权限问题)【英文标题】:Impersonating caller prevents connection to database (not an obvious permissions issue) 【发布时间】:2012-09-27 11:59:00 【问题描述】:

我有一个托管在 IIS 中的 Web 服务,该服务在一个域帐户下运行,该域帐户也有权访问 SQL Server。下面提到的所有用户都可以访问此 SQL Server。

这是服务配置的片段:

<basicHttpBinding>
<binding name="SecureWebBinding">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />

...等等

在特定的服务方法期间,我以服务帐户的身份调用数据库,并希望以调用服务的用户身份进行另一次调用(我们正在返回由调用用户创建的 FILESTREAM 事务上下文 - 这些是用户 -具体的)。第一个调用完成,但第二个调用如下:

using (ServiceSecurityContext.Current.Impersonate())
                    
   using (var connection = new SqlConnection(...Integrated Security = true...)
   
      connection.Open(); //<---Exception

调用Impersonate 后,WindowsIdentity.GetCurrent() 正确返回调用用户而不是ImpersonationLevel == Identification 的服务帐户。

如果我删除前 2 行,操作将作为服务帐户的身份完成。当然,后来对 FILESTREAM 的调用随后会失败。

【问题讨论】:

这似乎是模拟与委派的问题,因为 SQL Server 在另一个盒子上。那么,我该如何委托 %#$@? 【参考方案1】:

您需要为服务器设置一个 SPN,以便在您模拟时使用 kerberos。但这取决于您收到的错误消息。该资源应该可以帮助您,尽管我仍然遇到类似流程的问题,但是您的流程似乎应该与此一起使用:

http://blogs.msdn.com/b/sql_protocols/archive/2006/12/02/understanding-kerberos-and-ntlm-authentication-in-sql-server-connections.aspx

【讨论】:

以上是关于模拟调用者阻止连接到数据库(不是明显的权限问题)的主要内容,如果未能解决你的问题,请参考以下文章

php 在自己的线程中运行php脚本而不阻止调用者

应用内购买被“无法连接到商店”阻止

Xamarin iOS 模拟器无法连接到 Rest API

使用 SQLyog 导出 MySQL 所有数据库会产生调用者/定义者权限错误

如何在新线程上运行任务并立即返回给调用者?

代码:403 消息:调用者没有权限