【发布时间】:2011-08-23 02:53:57
【问题描述】:
我有一个使用 WCF 与后端 SQL Server 2008 数据库通信的 SL4 应用程序。由于调用的存储过程所需的数据库权限,其中一项 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”登录失败。
在数据库连接中忽略了模拟。有什么想法吗?
【问题讨论】:
-
您应该始终检查 ImpersonateLoggedOnUser 的返回值。仅当调用成功时,您才应该运行旨在在模拟上下文中运行的代码。如果调用失败,错误代码 (
new Win32Exception().NativeErrorCode) 会告诉您原因。您还应该在模拟代码周围有一个 try 块,并始终在 finally 块中调用 RevertToSelf。 -
我拥有这一切。我保持我的代码示例简短只是为了解决主要问题。无论如何,谢谢。
-
你能把我的答案取消标记为答案吗?我想我没有正确阅读这个问题。对不起。
-
@Aliostad - 完成。抱歉,如果对这个问题有任何混淆。我想做的就是使用固定域帐户从 WCF 服务中访问我们的数据库。下面列出的我的解决方案现在工作正常。
标签: sql-server wcf silverlight-4.0 wcf-security impersonation