关于 web.config 中的模拟、身份验证和授权的困惑

Posted

技术标签:

【中文标题】关于 web.config 中的模拟、身份验证和授权的困惑【英文标题】:Confusion about impersonation, authentication, and authorization in web.config 【发布时间】:2011-06-14 18:39:49 【问题描述】:

我正在尝试在我的 asp.net 网站项目中检索当前用户的 Windows 登录用户名。

我的 web.config 文件有以下项目

        <identity impersonate="true"/>
        <authentication mode="Forms">
            <forms name="app" path="/path" loginUrl="/path/login.aspx" protection="All" timeout="100" />
        </authentication>
        <authorization>
            <deny users="?" />
                <allow users="*"/>
        </authorization>

我的理解是,通过这种配置,我应该能够从WindowsIdentity.GetCurrent().Name 检索域\用户名。但是,此属性返回 NT AUTHORITY\IUSR,它是匿名访问的用户。如果我没记错的话,我在我的授权部分拒绝匿名访问该网站。我错过了什么?

还要注意:

System.Web.HttpContext.Current.Request.LogonUserIdentity.Name 也返回 NT AUTHORITY\IUSR 和 Request.ServerVariables["LOGON_USER"] 返回一个空字符串,这与此知识库文章 http://support.microsoft.com/kb/306359 中的信息不符

我正在使用 .net 4.0 和 Windows 7 开发环境。

一些使我达到这一点的资源:

http://msdn.microsoft.com/en-us/library/ff647076.aspx

http://support.microsoft.com/kb/306158

http://forums.asp.net/t/1121780.aspx/1?Getting+a+users+DOMAIN+username+from+a+web+application

感谢您的宝贵时间。

编辑

应该注意的是,我被锁定在表单身份验证中(Windows 身份验证不是一个选项),因为这是一个多租户站点,大多数用户不会使用此单点登录功能。

【问题讨论】:

【参考方案1】:

如果您使用表单身份验证,那么模拟毫无意义 - 它仅适用于 Windows 身份验证。这同样适用于 Request.ServerVariables["LOGON_USER"]。

您看到 IUSR_ 的原因是因为这是运行网站的 Windows 帐户,您应该使用 Page.CurrentUser (WebForms) 或 User 属性 (MVC Controllers),而不进行强制转换。这将返回 Forms Auth 用户名。

【讨论】:

我不会说模仿完全没有意义。像我在这个问题中那样做一个测试:***.com/questions/3632456/… @blowdart:+1 简洁明了的答案:) 那么有没有办法在表单身份验证下检索Windows登录域\用户名? Page.CurrentUser 不是属性,Page.Request.LogonUserIdentity.Name 像其他所有内容一样返回 NT AUTHORITY\IUSR。 根本没有带有表单身份验证的 Windows 登录,这就是为什么您会看到您所看到的。 是的,我研究得越多,就越能准确地看到你在说什么。我的印象是这可能是因为表 1,在这篇 msdn 文章的底部。 msdn.microsoft.com/en-us/library/ff647076.aspx

以上是关于关于 web.config 中的模拟、身份验证和授权的困惑的主要内容,如果未能解决你的问题,请参考以下文章

web.config 中的多个/不同身份验证设置

允许对 web.config 中的单个文件夹进行匿名身份验证?

web.config 中的 loginURL 在基于虚拟目录的页面中形成身份验证

文件夹中的 web.config 允许全部或不进行用户身份验证

IIS Express - 临时模拟经过身份验证的用户

如何使用默认域在 Web.config 中启用基本身份验证和匿名身份验证?