23

I have an ASP.NET 3.5 application that uses ASP.NET forms authentication. I want to be able to get the Windows user name currently logged into the computer (NOT logged into the ASP.NET application, but into Windows) when data is edited in a page.

If I use Context.User.Identity.Name.Tostring(), I get the user name logged into the ASP.NET application, but I need the Windows account name.

System.Security.Principal.WindowsIdentity.GetCurrent().Name.Tostring()

Also, it only works when I run the website from Visual Studio, but after deploying to IIS it returns NT AUTHORITY\SYSTEM.

4

8 回答 8

17

您必须Windows在配置中将身份验证模式设置为并在授权标签中禁用匿名用户。

于 2013-04-24T06:26:14.120 回答
10

要将当前登录的用户获取到 Windows 帐户,您必须使用Windows authentication而不是Forms authentication

System.Security.Principal.WindowsIdentity.GetCurrent().Name.Tostring() 也仅在我从 Visual Studio 运行网站时有效,但在部署到 IIS 后它返回 NT AUTHORITY\SYSTEM

它显示应用程序当前用户。当您在 Visual Studio Web 服务器上托管应用程序时,它使用您的本地帐户。但是,当您使用不同的凭据登录 Web 应用程序时,它将始终显示您当前的 Windows 登录信息。

在您的情况下,部署到 IIS 的应用程序使用 NT AUTHORITY\SYSTEM 帐户。

于 2013-04-24T06:24:46.140 回答
9

要在 C# 中获取当前登录的用户到 Windows,请使用:

string Username = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
于 2016-03-29T12:23:33.820 回答
8

我为此挣扎,挣扎,挣扎。其中一件事是我无法访问已锁定的 IIS,因此我无法更改任何服务器设置。我不得不去做我能够在代码中做的事情。当我研究它时,许多回复说,“这样设置IIS”。. .嗯,当您可以访问 IIS 时,这很好,但我没有——我必须使用我可以在代码中做的事情。所以,我最终像这样处理它:

在我的 Web 配置文件中,我在该部分中添加了以下代码行:

<system.webServer>
<security>
  <authentication>
    <anonymousAuthentication enabled="false" />
    <windowsAuthentication enabled="true" />
  </authentication>
</security>
</system.webServer>

然后,它在我的本地返回一个错误,我必须进去修复。我转到位于我机器上以下路径中的 applicationhost.config 文件(您的可能不同):

C:\users\"你的用户名"\My Documents\"yourIISInstallation"\config\applicationhost.config

我将以下设置更改为“允许”,该设置已设置为“拒绝”:

<section name="anonymousAuthentication" overrideModeDefault="Deny" />

变成

<section name="anonymousAuthentication" overrideModeDefault="Allow" />

<section name="windowsAuthentication" overrideModeDefault="Deny" />

<section name="windowsAuthentication" overrideModeDefault="Allow" />

在里面

<sectionGroup name="authentication">

部分。在我发现这个修复之前,我把头发拉出来了。我希望这可以帮助别人。一旦我将上面的代码放入 webconfig 文件中,它就可以在内网上运行,它只是在我的本地返回错误,但是一旦我将上面的代码添加到我的本地 applicationhost.config 文件中,它就开始在我的本地运行也是。然后,我调用了以下变量来返回 windows 上登录用户的名称:

    HttpContext.Current.User.Identity.Name.ToString().Substring((HttpContext.Current.User.Identity.Name.ToString().IndexOf("\\")) + 1);

干杯!

于 2017-08-07T18:09:35.777 回答
4

我用这个:

System.Security.Principal.WindowsPrincipal user;
user = new WindowsPrincipal(this.Request.LogonUserIdentity);
this.Request.LogonUserIdentity.Impersonate();
user_name = user_name.Substring(user_name.LastIndexOf("\\") + 1);
于 2013-04-24T06:27:39.413 回答
1
string strName = HttpContext.Current.User.Identity.Name.ToString();

就像您希望的那样是正确的,但是您需要先设置网络服务器,请参阅如何使用 ASP.NET 获取 Window NT 记录的用户名(设置网络服务器的第一步)。

于 2013-04-24T06:19:52.803 回答
0

尝试使用以下代码行:

string loggedOnUser = string.Empty;
 loggedOnUser = Request.ServerVariables.Get("AUTH_USER");

当您从 Visual Studio 运行应用程序时,您可能无法获取这些值...在 IIS 中部署后检查它。

要获取用户名,请使用:

string userName = string.Empty;
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, "Your Domain Name"))
{
    UserPrincipal user = new UserPrincipal(pc);
    user = UserPrincipal.FindByIdentity(pc, "User ID Will Come here");
    if (user != null)
    {
        userName = user.GivenName + " " + user.Surname;

    }
    else
    {
        //return string.Empty;
        userName = "User Not Found";
    }
}
于 2013-04-24T06:24:14.717 回答
0

我设法按照以下链接中方法 1 中的说明解决了此问题 - https://support.microsoft.com/en-us/help/896861/you-receive-error-401-1-when-您浏览使用集成的网站 简而言之,禁用除 Windows 身份验证之外的所有身份验证方法。在管理员帐户下打开 regedit,找到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0,右键单击节点并选择新建,然后选择多字符串值。输入“BackConnectionHostNames”并单击 Enter。对于值,输入您尝试设置访问权限的网站,然后单击确定。重新启动 IIS 完成后,我可以使用 HttpContext.Current.User.Identity.Name 获取当前 Windows 用户,WindowsPrincipal(this.Request.LogonUserIdentity) 也让我获得了登录的 Windows 用户名。供参考 System.Environment .UserName 和 System.Security.Principal.WindowsIdentity.GetCurrent().Name,这两个仍然给 IIS 用户。

这花了我很长时间才弄清楚。祝你好运。IIS 是一场醒着的噩梦!

于 2018-06-11T08:43:27.857 回答