使用集成管道模拟域用户

时间:2012-10-19 01:52:37

标签: iis-7.5 windows-authentication windows-server-2008-r2 impersonation integrated-pipeline-mode

这个问题一直困扰着我......

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

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

enter image description here

谢谢! ;)

2 个答案:

答案 0 :(得分:25)

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

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

经典模式

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

集成模式

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

现在这里是踢球者!!

如果您想使用集成模式(这是理想的,因为它产生更多功能,以及集成),您将需要启用委派。以下是一些必读文章,用于了解DelegationDynamic SPN Registration的基础知识。由于这会涉及到您可能需要深入研究的更多Kerberos和安全注意事项,因此可能更容易坚持使用经典模式,您只需启用模拟并将其称为一天;或者作弊并禁用validateIntegratedModeConfiguration。 :P

我希望这可以帮助那些关于interwebz的人。干杯! :)

答案 1 :(得分:12)

不,但是"集成"管道要求您手动模拟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.