如何使用HttpListener处理WindowsImpersonationContext?

时间:2014-07-02 20:43:38

标签: c# visual-studio httplistener

以前可能会有一个稍微不同的方式,但我还没有完全满意。

使用 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游戏,并且之前从未遇到过。

我们当然可以使用管理服务帐户运行此工具。但这样做似乎很愚蠢 - 如果假冒存在,并且它完全存在于这种目的,我想知道我做错了什么以及它为什么不起作用。

1 个答案:

答案 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组是   默认添加在那里。

哦,好的。因此,我深入了解了我的服务用户帐户的本地安全策略,此功能为该帐户启用了

但是一旦我添加它......它有效! :)

Working Example

请注意我的“wwtest”用户帐户已明确添加到此处。一旦我注销/开启,所有内容都会被点击。

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