这个问题一直困扰着我......
在本地Intranet环境中,如果我们想要使用模拟我们的Windows域用户,我们注定要在我们的应用程序池中使用“经典”管道模式,或者是否有一种新的方式来声明性地“运行”它们(所以 - 到发言)?
我的目标是在我的Intranet上对本地Web应用程序使用Windows身份验证,以便用户可以在其活动目录帐户下进行身份验证和运行应用程序(原则)。每次我尝试这个(当然使用NetworkService身份),我都会收到此错误:
谢谢! ;)
答案 0 :(得分:25)
我写了一个小应用程序来显示从Page.User.Identity.Name
等几个不同地方抓取的当前用户的网络用户名。我还使用几种不同的方法来查询有关域用户的信息,以查询ActiveDirectory。所有这些都是为了验证以下内容。
我找到了两种使用Windows身份验证运行应用程序的主要模式,根据我的研究,主要用于Intranet环境。以下是配置的最基本要素:
经典模式
集成模式
现在这里是踢球者!!
如果您想使用集成模式(这是理想的,因为它产生更多功能,以及集成),您将需要启用委派。以下是一些必读文章,用于了解Delegation和Dynamic 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.