【问题标题】:How do I handle WindowsImpersonationContext with HttpListener?如何使用 HttpListener 处理 WindowsImpersonationContext?
【发布时间】: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


【解决方案1】:

我相信我已经找到了答案。使用antiduh的概念,我找到了这个页面:

http://support.microsoft.com/kb/821546

某些使用模拟的程序可能无法在您之后正常运行 安装 Windows 2000 SP4

在您的计算机上安装 Windows 2000 Service Pack 4 (SP4) 后, 某些使用模拟的程序可能无法正常运行。

当使用的用户帐户时,可能会出现此问题 运行程序没有“Impersonate a client after 身份验证”用户权限。

所以这让我走上了这条路。那让我在这里 http://blogs.technet.com/b/askds/archive/2008/11/25/fun-with-the-kerberos-delegation-web-site.aspx

注意这一步是为了让IISKerbSvc(应用程序池 身份)在网络服务器上模拟用户的能力。 如果 您查看计算机的用户权限分配,您将看到 身份验证后模拟客户端,并且 IIS_WPG 组是 默认添加在那里。

哦,好的。因此,我深入研究了我的服务用户帐户的本地安全策略,并且该帐户未启用了此功能。

但是一旦我添加它......它就起作用了! :)

请注意我在此处明确添加的“wwtest”用户帐户。一旦我注销/登录,一切都点击到位。

所以这就是答案。为了使模拟真正起作用,您必须是本地管理员,或者作为已经启用该标志的内置服务帐户之一运行,或者您必须进入此处并转这个在

【讨论】:

猜你喜欢
  • 2015-04-01
  • 2014-11-11
  • 2012-02-20
  • 2012-10-08
  • 2014-12-17
  • 2021-04-09
  • 2018-11-06
  • 2013-10-18
  • 2013-11-12
相关资源
最近更新 更多