我有一个WCF Web服务,其中包含需要在不同用户下运行的不同部分。
其中一个是群集,这是使用 Interop.MSClusLib API实现的。
我正在尝试应用模拟使用指定用户,但完全忽略。
using (new Impersonator(_impersonation.User, _impersonation.Domain, _impersonation.Password))
{
var cluster = new Cluster();
cluster.Open(clusterName);
}
(模仿者:http://www.codeproject.com/KB/cs/zetaimpersonator.aspx)
WindowsIdentity.GetCurrent()获取我正在冒充的用户,但我仍然得到:
访问被拒绝。 (HRESULT异常:0x80070005(E_ACCESSDENIED)) 在MSClusterLib.ClusterClass.Open(String bstrClusterName)
当我为该用户设置应用程序池标识时,它确实有效,但这不是我想要做的。
是否以任何方式可以获得修复?
Thx!
答案 0 :(得分:1)
从同事那里得到解释:
在应用程序中有两个级别的身份验证:进程和线程。
Impersionation只设置线程标识,而Cluster API似乎使用进程标识。< / p>
答案 1 :(得分:0)
将AppPool标识更改为模拟用户时未收到错误的原因是代码在具有该标识的线程中运行。在IIS中托管WCF时,服务实例始终以AppPool标识运行。模拟用户不会更改正在运行的线程的安全上下文。
MSClusLib可能正在访问“远程”资源来执行其工作。 Windows模拟无法(允许)访问“远程”资源。您可以通过实施委派而非模拟来执行您所需的操作。您应该查看this MSDN article以了解模仿和&amp;代表团在WCF工作。
答案 2 :(得分:0)
这看起来应该对我有用。我认为你是正确的IIS主机是问题。检查您的应用程序池帐户是否“作为操作系统的一部分”。这篇关于accessing network files from IIS的MS支持文章正在按照您的描述进行:
LogonUser还要求调用LogonUser的帐户具有 “作为操作系统的一部分”用户管理器中的权限。通过 默认情况下,IIS在处理HTTP时模拟的大多数用户 请求没有此用户权限。但是,对于“正在进行中 应用“有很多方法可以引起你的潮流 安全上下文更改为LocalSystem帐户,具有 “作为操作系统的一部分”行政凭证......
如果这不起作用,我建议快速测试在IIS之外托管您的服务(Visual Studio服务主机很容易进行此类测试)。在你花更多时间在这条路上之前确保IIS确实是问题...