【问题标题】:Get name of authenticated windows user获取经过身份验证的 windows 用户的名称
【发布时间】:2014-06-11 14:05:29
【问题描述】:

这就是我正在尝试做的事情:

我想使用 Windows 身份验证保护 ASP.NET 应用程序上的特定虚拟目录。虚拟目录只有一个文件,default.aspx。在代码隐藏中,我只想获取登录用户的 Windows 用户名,但无论我使用什么属性,它都会返回应用程序的安全上下文。

我需要站点本身在“AppContext”用户的上下文下运行以获得文件权限等。但是,要确定用户是否有权访问该站点,我需要使用该用户的 Windows 域凭据。

IIdentity windowsIdentity = WindowsIdentity.GetCurrent();

logger.Info("Windows username: " + windowsIdentity.Name);
logger.Info("System.Environment.Username: " + System.Environment.UserName);
logger.Info("HttpContext: " + HttpContext.Current.User.Identity.Name);

输出是:

Windows username: DOMAIN\AppContext
System.Environment.Username: AppContext
HttpContext: 

假设我以自己的身份登录并且我的 Windows 用户名是“Scott”,我希望 HttpContext 返回“DOMAIN\Scott”,但它什么也不返回。尝试访问虚拟目录时,我确实得到了 Windows 身份验证对话框,并且我可以成功地以“Scott”身份进行身份验证。在 IIS7 身份验证对话框中,所有身份验证机制均已关闭,“Windows 身份验证”除外。

奇怪的是,我有另一个网站运行良好,但我不知道有什么区别。我能看到的唯一区别是工作站点是一个实际的 IIS 网站,而我目前正在处理的是一个虚拟目录。

工作站点的输出如下。这是我试图在虚拟目录上复制的内容,但我一定遗漏了一些东西。

Windows username: DOMAIN\Scott
System.Environment.Username: AppContext
HttpContext: DOMAIN\Scott

附加说明:

  • 这两个网站在 web.config 中都没有 <identity> 元素。
  • <authentication mode="Windows" /> 设置正确。
  • 虚拟目录和站点都只在 IIS 中启用了 Windows 身份验证。
  • 代码正在Page_Init 方法中执行。
  • 底线是,我只需要让站点本身在“AppContext”用户(AppPool 配置为运行)的安全上下文下运行,但我需要获取当前登录用户的名称在 default.aspx.cs 代码后面。

【问题讨论】:

  • 您的 Web.config 中的身份验证模式是什么?是<authentication mode="Windows" /> 吗?
  • 还要确保为您的项目禁用匿名身份验证(选择 Web 窗体项目,然后按 F4 打开“属性”面板)并启用 Windows 身份验证。这些都是项目属性。
  • 更新了问题以包含“
  • 你什么时候打电话?
  • 丹尼尔,在我的问题底部的注释部分,它提到我在 Page_Init 中调用它

标签: c# asp.net .net windows-authentication


【解决方案1】:

您可以在 System.Threading.Thread.CurrentPrincipal.Identity.Name 中找到它。

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Response.Write(System.Threading.Thread.CurrentPrincipal.Identity.Name);
    }
}

【讨论】:

  • 这也是一个 NULL 值。
  • 所以在这种情况下,您应该仔细检查 Windows 身份验证是否是唯一启用的。如果我没记错的话,服务器将依次尝试匿名、基本、表单和 Windows,因此如果首先启用其他其中之一,那么它将选择对用户进行身份验证。要确认这一点,您可以禁用 IE 中的自动身份验证功能。此处的说明:bit.ly/1pkeKIo 确保系统提示您登录。
【解决方案2】:

在文件夹内添加一个 Web.config 并设置<authentication mode="Windows"/>

【讨论】:

    【解决方案3】:

    检查您的授权设置。

    如果匿名用户可以访问该资源 - 并且浏览器请求链中较早的资源没有触发身份验证 - IIS 将不会对用户进行身份验证。

    因此,您必须拥有 Windows 身份验证并拒绝匿名访问,才能在 HttpContext 中查看用户名。

    【讨论】:

    • 奇怪的是,当我将 添加到虚拟目录内的 web.config 时,它永远不会让我登录。它只是无限重新显示 Windows 身份验证对话框。可能与它有关...
    • 是的。未授权 - 您删除匿名但不授予任何人登录权;)无限循环;)
    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2020-07-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多