在本地 Intranet 环境中,如果我们想使用 Impersonate 我们的 Windows 域用户,我们注定要在我们的应用程序池中使用“经典”管道模式,还是有一种新的方式来声明性地“运行”他们(可以这么说)?
我的目标是在我的 Intranet 上对本地 Web 应用程序使用 Windows 身份验证,以便用户可以在其 Active Directory 帐户下进行身份验证和运行应用程序(原理)。每次我尝试这个(当然使用 NetworkService 身份)时,我都会收到此错误:
在本地 Intranet 环境中,如果我们想使用 Impersonate 我们的 Windows 域用户,我们注定要在我们的应用程序池中使用“经典”管道模式,还是有一种新的方式来声明性地“运行”他们(可以这么说)?
我的目标是在我的 Intranet 上对本地 Web 应用程序使用 Windows 身份验证,以便用户可以在其 Active Directory 帐户下进行身份验证和运行应用程序(原理)。每次我尝试这个(当然使用 NetworkService 身份)时,我都会收到此错误:
我写了一个小应用程序来显示当前用户的网络用户名,这些用户名是从几个不同的地方抓取的,例如Page.User.Identity.Name
. 我还使用几种不同的方法查询 Active Directory 来获取有关域用户的信息。这一切都验证了以下内容。
我发现了两种使用 Windows 身份验证运行应用程序的主要模式,根据我的研究,这主要用于 Intranet 环境。以下是配置的最低基本要素:
经典模式
集成模式
现在这是踢球者!
如果您想使用集成模式(这是理想的,因为它会产生更多功能,而且集成),您将需要启用委派。这里有几篇必读的文章来了解委派的基础知识,以及动态 SPN 注册的扩展。由于这涉及到您可能需要深入研究的更多 Kerberos 和安全注意事项,因此坚持使用经典模式可能会更容易,您所要做的就是启用模拟并收工。否则作弊并禁用validateIntegratedModeConfiguration
.
否,但“集成”管道需要您手动模拟 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();
问题? 有时您需要使用委托而不是模拟。