您不能将模拟部分与身份验证部分分开。我想你知道,因为你写了
...asp.net 自动模拟登录用户(如果不使用 Windows 身份验证,则模拟匿名帐户)...
但我被这句话弄糊涂了
为了便于讨论,我们假设身份是在 IIS 中设置的,而不是在 web.config 文件中。
这到底是什么意思?
但无论如何,让我试一试:
假设您在 Web.config 中使用 IntegratedWindowsSecurity、<identity impersonate=true> 和 <authentication mode=Forms>。这将对应于您引用的Building Secure ASP.NET Applications: Authentication, Authorization, and Secure Communication 中最后一个表的倒数第二行。
它指出在这种情况下Domain\UserName 将从WindowsIdentity 返回。我假设你想知道Domain\UserName-Identity 来自哪里......使用 Kerberos 有一些限制,比如 IE 必须将 URL 分类为“Intranet”或“Local”,但我认为这在这里并不重要。
现在区分在 Web.config 中设置 <authentication mode=windows> 和在 IIS 中将访问模式设置为 IntegratedWindowsSecurity(或其他任何名称)是很重要的。在上述链接的最后一个表中,我们处于将 IIS 设置为 IntegratedWindowsSecurity 的情况(尽管我们可以在 Web.config 中设置<authentication mode="windows">!)。因此 IE 与 IIS 协商如何验证当前登录的用户。使用 NTLM 或 Kerberos(主要取决于 Windows 版本)。这就是Domain\UserName 的来源。
下面的文章(我知道是关于委托的)可能会更清楚地说明这个问题ASP.NET Delegation:
集成 Windows 身份验证
当 Internet Explorer 尝试
访问受保护的资源,IIS 发送
两个 WWW-Authenticate 标头
浏览器、协商和 NTLM。这
协商标头仅由 IIS 发送
在 Windows 2000 或更高版本上运行。这
标头表示 IIS 支持
协商协议,它使
互联网之间发生的协商
Explorer 和 IIS 关于是否使用
Kerberos 或 NTLM 身份验证。 IIS
如果两个客户端都使用 Kerberos
(Internet Explorer 5.0 及更高版本)和
服务器(IIS 5.0 及更高版本)正在运行
Windows 2000 或更高版本,两者都是
同一域或受信任的成员
域。否则,服务器
默认使用 NTLM。
由于 NTLM 对用户进行身份验证
IIS 不提供用户的
IIS 的凭据,IIS 不能
将该用户的凭据委托给
远程机器。
与 Kerberos 结合使用时
v5 身份验证,IIS 可以委托
计算机之间的安全凭证
运行 Windows 2000 或更高版本的
受信任并配置为委派。
您可能知道这些链接,但我还是发布了它们:
编辑:
更准确地说,我 认为(此处不确定)IIS 使用解释的构造函数从 LogonToken(通过调用非托管 Win32 LogonUser 函数获得的)创建 WindowsIdentity here in msdn。 WindowsIdentity Class 文档中的示例代码也很有趣(例如IntPtrStringTypeConstructor)。那么登录令牌必须来自 IE。
Scott Hanselman 也写过类似的文章:System.Threading.Thread.CurrentPrincipal vs. System.Web.HttpContext.Current.User or why FormsAuthentication can be subtle。
如果您寻找将自定义主体对象“植入”到 ASP.NET 身份验证过程中的解决方案(通常在Global.asax 中使用Application_AuthenticateRequest),我认为您可能能够提取更多信息。比如Using Custom Principal with Forms Authentication in ASP.NET。
或者您可以使用Reflector 自己查看:)