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

时间:2012-09-27 11:59:01

标签: wcf impersonation

我在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的服务帐户。

如果我删除前两行,则操作将作为服务帐户的标识完成。当然后来对FILESTREAM的调用失败了。

1 个答案:

答案 0 :(得分:0)

当您模仿时,您需要为服务器设置SPN,因为它使用kerberos。但这取决于您获得的错误消息。这个资源可以帮助你,虽然我仍然遇到类似过程的问题,但你的过程似乎应该适用于此:

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