22

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

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

错误信息截图

4

2 回答 2

27

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

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

经典模式

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

集成模式

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

现在这是踢球者!

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

于 2012-10-29T17:23:52.090 回答
13

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

为什么? 经典模拟破坏了 .NET 的异步特性。具体来说,当线程被多个用户同时使用时,很难管理线程的 WindowsIdentity。

如何? 使用 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();

问题? 有时您需要使用委托而不是模拟。

于 2014-03-27T15:43:47.043 回答