获取经过身份验证的Windows用户的名称

时间:2014-06-11 14:05:29

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

所以这就是我试图做的事情:

我想使用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方法中执行。
  • 最重要的是,我只需要让网站本身在&#34; AppContext&#34;的安全上下文中运行。 user(AppPool配置为以其身份运行)但我需要在default.aspx.cs代码中获取当前登录用户的名称。

3 个答案:

答案 0 :(得分:0)

检查您的授权设置。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您将在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);
    }
}