我正在为我们的分析师构建一个 Intranet MVC 4 应用程序。目标是允许内部用户访问此应用程序,而无需登录,因为他们是我们内部网络的一部分。当他们访问应用程序时,我希望能够捕获他们的 Windows 用户名并使用 LDAP 检查活动目录并检索他们所属的部门并在屏幕上显示相关详细信息。根据不同论坛的建议,我为此应用程序选择了 Windows 身份验证,并且能够测试从 Visual Studio 成功运行的应用程序。我遇到的问题是当我将其部署到运行 IIS 7.5 的 UAT 服务器时。
<authentication mode="Windows">
</authentication>
<identity impersonate="false" />
这是我的 Web.config 文件的当前状态。无论模拟是真是假,应用程序似乎都不会捕获访问该应用程序的浏览器的 Windows 用户名。是
冒充=真实
根本需要这个吗?在主页的欢迎消息中,我总是看到托管应用程序/运行 IIS 的计算机的 Windows 用户名。我尝试了多种方法来捕获传入用户请求的 Windows 用户名。
string name = System.Web.HttpContext.Current.User.Identity.Name;
string name = System.Web.HttpContext.Current.Request.LogonUserIdentity.Name;
string name = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
string name = System.Web.HttpContext.Current.Request.ServerVariables["LOGON_USER"].Name;
等等。我还在这里查看了其他几篇文章,例如this https://stackoverflow.com/questions/1267071/how-to-get-windows-user-name-when-identity-impersonate-true-in-asp-net。但我无法让它发挥作用。我担心我是偶然实现这一目标,而不是真正理解发生了什么?有人可以指导我正确的方向吗?
不,你误解了模仿的目的。
首先,在集成模式下运行的 IIS 7 或更高版本中不再支持模拟。
其次,模拟的目的是更改工作进程在运行时运行的“用户”,特别是允许以该用户身份访问文件系统或数据库资源。一般来说,它与身份验证无关,并且对于大多数 Web 应用程序来说并不是特别有用。
您想要使用 Windows 身份验证,但您应该知道这仅适用于 Internet Explorer。它还仅适用于加入您的域的服务器,并且不存在任何中间 Kerberos 身份验证问题。 (这些通常称为“双跳”问题)。默认情况下,其他浏览器不会自动提供 Active Directory 帐户信息,尽管有些浏览器可能配置为允许这样做,但其他浏览器则不允许。
如果您使用的是经过 Windows 身份验证正确配置的服务器,并且您使用的浏览器支持 ActiveDirectory Kerberos 票证直通,并且不存在会导致此直通出现问题的网络问题,那么您可以使用HttpContext.Current.User.Identity.Name
获取用户名。
不要使用 LogonName 或类似的名称,因为它们只会为您提供工作进程,而不是经过身份验证的用户名。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)