【发布时间】:2014-07-02 20:43:38
【问题描述】:
这可能以前被问过的方式略有不同,但我还没有完全满足自己。
使用 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,版本=4.0.0.0,文化=中性, PublicKeyToken=b77a5c561934e089' 或其依赖项之一。要么 未提供所需的模拟级别,或提供的 模拟级别无效。 (HRESULT 异常:0x80070542)
而且我似乎无能为力。我在其他地方读到这可能是因为低权限帐户无法模拟管理员帐户,至少没有 UAC 提示。
如果这是真的,IIS 是如何做到这一点的?因为我用模拟做了很多疯狂的 ASP.Net 事情,以前从未遇到过。
我们当然可以使用管理员服务帐户运行此工具。但是这样做似乎很愚蠢-如果存在模仿,并且正是为了这种目的而存在,我想知道我做错了什么以及为什么它不起作用。
【问题讨论】:
-
我最近也遇到过这个问题,一直没有得到明确的解决方案。我认为这可能与尝试执行模拟的用户设置的安全位有关。我认为您不必是管理员,但您必须是具有正确角色的用户。 Impersonate() 调用成功了,即使它确实失败了,这确实很奇怪。
-
查看此文档:msdn.microsoft.com/en-us/library/windows/desktop/…。一项要求是用户具有 SeImpersonatePrivilege 权限。
-
如果你弄明白了,请务必为世界其他地方发布答案:)
-
我想你给了我我需要的运气
-
我同意,模拟呼叫并未真正成功的事实会给您带来误报。在这种情况下,模拟调用需要失败,或者返回某种状态代码,您可以检查是否存在部分模拟
标签: c# visual-studio httplistener