我有一个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'登录失败。
在数据库连接中忽略模拟。有什么想法吗?
答案 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。