Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取经过身份验证的windows用户的名称_C#_Asp.net_.net_Windows Authentication - Fatal编程技术网

C# 获取经过身份验证的windows用户的名称

C# 获取经过身份验证的windows用户的名称,c#,asp.net,.net,windows-authentication,C#,Asp.net,.net,Windows Authentication,下面是我想做的: 我想使用Windows身份验证保护ASP.NET应用程序上的特定虚拟目录。虚拟目录只有一个文件default.aspx。在代码隐藏中,我只想获取登录用户的Windows用户名,但不管我使用什么属性,它都会返回应用程序的安全上下文 我需要站点本身在“AppContext”用户的上下文中运行以获得文件权限等。但是,要确定用户是否有权访问站点,我需要使用该用户的Windows域凭据 IIdentity windowsIdentity = WindowsIdentity.GetCurr

下面是我想做的:

我想使用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中都没有
    元素
  • 设置正确
  • 虚拟目录和站点在IIS中仅启用了Windows身份验证
  • 代码正在
    Page_Init
    方法中执行
  • 底线是,我只需要让站点本身在“AppContext”用户(AppPool配置为作为其运行)的安全上下文下运行,但我需要在default.aspx.cs代码中获取当前登录的用户名。

检查您的授权设置

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


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

在文件夹中添加一个Web.config并设置
,您将在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);
    }
}

您的Web.config中的身份验证模式是什么?是否是
?还要确保对您的项目禁用了匿名身份验证(选择Web窗体项目,然后点击F4打开属性面板),并且启用了Windows身份验证。这两个都是项目属性。更新了问题,以包括“您何时调用它?Daniel,在我问题底部的注释部分,它提到我在第_init页中调用它,它返回为空值。因此,在这种情况下,您应该仔细检查Windows身份验证是否是唯一启用的身份验证。如果我没有记错,服务器将依次尝试匿名、基本、窗体和窗口,因此,如果先启用其中一个,那么它将选择该选项来验证用户。要确认这一点,您可以禁用IE中的自动身份验证功能。此处的说明:确保系统提示您登录。奇怪的是,当我添加到虚拟目录中的web.config时,它从不允许我登录。它只是无限地重新显示Windows身份验证对话框。可能与此有关…是的。未授权-您删除匿名,但不授予任何登录权限;)无限循环;)