模拟调用者阻止连接到数据库(不是明显的权限问题)
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
【讨论】:
以上是关于模拟调用者阻止连接到数据库(不是明显的权限问题)的主要内容,如果未能解决你的问题,请参考以下文章