模拟无法进行数据库连接

时间:2011-05-11 08:41:31

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

我有一个SL4应用程序,它使用WCF与后端SQL Server 2008数据库进行通信。由于调用的存储过程所需的数据库权限,其中一个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'登录失败。

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

2 个答案:

答案 0 :(得分:2)

在致电LOGON32_LOGON_NETWORK时,将LOGON32_LOGON_NETWORK_CLEARTEXT更改为LogonUser

这会缓存本地安全提供程序中的登录凭据,该凭据应该能够与SQL Server成功进行SSPI握手。

答案 1 :(得分:0)

我实际上设法通过摆脱模拟API代码并将以下内容添加到我的web.config来实现这一点:

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

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