使用集成管道模拟域用户

Posted

技术标签:

【中文标题】使用集成管道模拟域用户【英文标题】:Impersonate Domain User with Integrated Pipeline 【发布时间】:2012-10-09 14:21:06 【问题描述】:

在本地 Intranet 环境中,如果我们想使用 Impersonate 我们的 Windows 域用户,我们是否注定要在我们的应用程序池中使用“经典”管道模式,或者是否有一种新的方式来声明性地“运行”他们(所以-说话)?

我的目标是在我的 Intranet 上对本地 Web 应用程序使用 Windows 身份验证,以便用户可以在其 Active Directory 帐户下进行身份验证和运行应用程序(原则)。每次我尝试这个(当然是使用 NetworkService 身份),我都会收到这个错误:

【问题讨论】:

【参考方案1】:

我写了一个小应用程序来显示当前用户的网络用户名,这些用户名是从几个不同的地方抓取的,例如Page.User.Identity.Name。我还使用几种不同的方法查询 Active Directory 来获取有关域用户的信息。这一切都是为了验证以下内容。

我发现了两种使用 Windows 身份验证运行应用程序的主要模式,根据我的研究,这主要用于 Intranet 环境。以下是配置的最基本要素:

经典模式

AppPool - 托管管道设置为经典模式。 AppPool - 身份设置为网络服务。 身份验证 - 已禁用:匿名身份验证 身份验证 - 已启用:ASP.NET 模拟 身份验证 - 已启用:Windows 身份验证 提供程序 - 已禁用:Kerberos 高级设置 - 内核模式:任一

集成模式

AppPool - 托管管道设置为集成模式。 AppPool - 身份设置为网络服务。 身份验证 - 已禁用:匿名身份验证 身份验证 - 已禁用:ASP.NET 模拟 身份验证 - 已启用:Windows 身份验证 提供程序 - 已启用:Kerberos 高级设置 - 内核模式:禁用

现在来了!

如果您想使用集成模式(这是理想的,因为它可以产生更多功能,而且集成),您需要启用委派。这里有几篇必读的文章来了解Delegation 的基础知识,以及扩展Dynamic SPN Registration。由于这涉及到您可能需要深入研究的更多 Kerberos 和安全考虑因素,因此坚持使用经典模式可能会更容易,您所要做的就是启用模拟并收工。否则作弊并禁用validateIntegratedModeConfiguration

【讨论】:

我刚刚在 Visual Studio 2017 中创建了一个新的 MVC 应用程序,并在设置向导中将身份验证设置为 Windows 身份验证(也选择了 .net framework 4.6.1),然后运行该应用程序,它会自动运行识别出windows用户。查看 web.config 文件,它根本没有 identity/impersonate 行。它只有 所以我想知道为什么你必须付出所有这些努力,或者这是我的环境中已经配置的东西,与 .net 无关? @tone 在生产服务器上运行应用程序与在本地计算机上使用 IIS express 不同。您的本地计算机在委派您的凭据时不会有问题。至少我所看到的。 @Chiramisu,使用您上面提到的经典设置允许我获得正确的用户名,但我无法将用户名/密码委托给另一个服务/SDK。关于集成模式,是否每个使用我的应用程序的用户都需要启用 Kerberos,还是只有运行 PoolApp 的用户?当我更改所有内容以匹配集成设置时,我无法再登录应用程序。它只是不断提示我提供我的用户名/密码。有什么想法吗? @MikeA 确保在您的 Windows 身份验证 > 提供程序中,首先列出了 Kerberos。除此之外,我很抱歉,但我不确定我能帮上什么忙。 @Chiramisu 请不要还原改进帖子格式的编辑,包括消除噪音和修复拼写错误等问题。【参考方案2】:

否,但“集成”管道需要您手动模拟 Windows Authenticated 用户。至少在 IIS8.5 中是这样的。

为什么? Classic impersonation break .NET's async features。具体来说,当线程被多个用户同时使用时,很难管理其WindowsIdentity。

怎么样? Use a WindowsImpersonationContext 例如

// Start with identity assigned by IIS Application Pool
var current = System.Security.Principal.WindowsIdentity.GetCurrent();

// Enable Windows Authentication in ASP.NET *and* IIS, which ensures 
// User.Identity is a WindowsIdentity
WindowsIdentity clientId = (WindowsIdentity)User.Identity;

// When 'using' block ends, the thread reverts back to previous Windows identity,
// because under the hood WindowsImpersonationContext.Undo() is called by Dispose()
using (WindowsImpersonationContext wic = clientId.Impersonate())

    // WindowsIdentity will have changed to match clientId
    current = System.Security.Principal.WindowsIdentity.GetCurrent();

// Back to the original identity
current = System.Security.Principal.WindowsIdentity.GetCurrent();

问题? Sometimes you need to use delegation instead of impersonation.

【讨论】:

User 类(如User.Identity)从何而来? 它是 MVC Controller 类中的一个属性,因此您可以在控制器中的操作中访问它并将其传递到您需要的地方。

以上是关于使用集成管道模拟域用户的主要内容,如果未能解决你的问题,请参考以下文章

配置squid集成域身份认证

同时模拟多个用户

/NetOnly 从非域 PC 模拟域用户

是否可以在没有 Windows 服务的情况下使用服务帐户(域)在不同的用户(模拟)下运行代码?

将特定域的 ASP.NET 模拟用户添加到 windows 身份验证

使用PetitPotam代替Printerbug