以前可能会有一个稍微不同的方式,但我还没有完全满意。
使用 Visual Studio 2013,Windows 7和一个小型的C#/ .NET 4.0 项目,我使用HttpListener构建一个小型Web服务器,以便托管一些简单的服务和页面。这里升级到现有项目的一部分是开始使用集成的Windows身份验证。
该项目提供的服务之一是连接到SQL数据库的方法 - 以便运行一些预制更新。使用WindowsImpersonationContext和正确的HttpListener启动参数,我很容易就能模仿"经过身份验证的用户(通过NTLM)。像这样:
identity = (System.Security.Principal.WindowsIdentity)context.User.Identity;
using (System.Security.Principal.WindowsImpersonationContext wic = identity.Impersonate())
{
doListenerCallback(context, lentry, true, identity);
}
这个想法是访问网页的用户的凭据是用于打开数据库连接的凭据。所以这段代码很好,它给了我一个对象,一切看起来都很好。
一切正常直到我使用常规用户帐户(非管理员)运行此项目(它托管在控制台应用内)。模拟仍然似乎发生,但我的appdomain不再允许程序集加载。我得到这样的东西:
fact = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
结果:
类型' System.IO.FileLoadException'的第一次机会异常。 发生在mscorlib.dll
其他信息:无法加载文件或程序集 ' System.Data.OracleClient,Version = 4.0.0.0,Culture = neutral, 公钥= b77a5c561934e089'或其中一个依赖项。要么a 未提供所需的假冒级别或提供的 模仿级别无效。 (来自HRESULT的异常:0x80070542)
我似乎无法做任何事情来超越这个。我在其他地方读到这可能是因为低级私人帐户无法冒充管理员帐户,至少没有UAC提示。
如果确实如此,IIS如何设法做到这一点?因为我做了很多疯狂的ASP.Net游戏,并且之前从未遇到过。
我们当然可以使用管理服务帐户运行此工具。但这样做似乎很愚蠢 - 如果假冒存在,并且它完全存在于这种目的,我想知道我做错了什么以及它为什么不起作用。
答案 0 :(得分:3)
我相信我找到了答案。使用antiduh的概念,我找到了这个页面:
http://support.microsoft.com/kb/821546
使用模拟的某些程序可能无法正常工作 安装Windows 2000 SP4
在计算机上安装Windows 2000 Service Pack 4(SP4)后, 某些使用模拟的程序可能无法正常运行。
在使用的用户帐户的情况下可能会发生此问题 运行该程序没有“冒充客户端后 身份验证“用户权利。
所以这让我走上了这条道路。那让我来这里 http://blogs.technet.com/b/askds/archive/2008/11/25/fun-with-the-kerberos-delegation-web-site.aspx
注意完成此步骤以允许IISKerbSvc(应用程序池) 身份)在Web服务器上模拟用户的能力。 如果 你看一下你将看到的计算机用户权限分配 在身份验证后模拟客户端并且IIS_WPG组是 默认添加在那里。
哦,好的。因此,我深入了解了我的服务用户帐户的本地安全策略,此功能为该帐户启用了 。
但是一旦我添加它......它有效! :)
请注意我的“wwtest”用户帐户已明确添加到此处。一旦我注销/开启,所有内容都会被点击。
所以这就是答案。为了模拟真正的工作,您必须是本地管理员,或者作为已经具有该标志的内置服务帐户之一运行,或者您必须进入此处并转向