我一生都无法弄清楚这一点。我正在尝试使用以下行获取登录 Windows 的当前用户的名称:
string user = System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString();
当我在发布并通过 IIS 打开它后运行此行时,它给我一个名称“IIS APPPOOL/SiteName”。但是,当我通过 Visual Studio 2013 调试器运行此命令时,会显示正确的名称。
我已经摆弄了配置、IIS 设置和字符串...但我认为这一行是我需要使用的:
string user = System.Web.HttpContext.Current.User.Identity.Name;
似乎正在返回一个我可以使用的域/用户名。看起来像是一个替代解决方案。
您必须在 ASP.NET 站点上启用 Windows 身份验证/模拟,否则它将在为应用程序池配置的任何帐户的上下文中运行。
https://msdn.microsoft.com/en-us/library/ff647405.aspx
<system.web>
...
<authentication mode="Windows"/>
<identity impersonate="true"/>
...
</system.web>
基于我在 IIS 下的测试,仅启用 Windows 身份验证,而不是在 web.config 上进行模拟;
System.Web.HttpContext.Current.User.Identity.Name;
返回当前登录用户而不是应用程序池用户,并且 System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString()
返回应用程序池用户。
我再次尝试并让他跟踪配置文件:
<system.web>
<authentication mode="Windows" />
</system.web>
对于
System.Security.Principal.WindowsIdentity.GetCurrent().Name.ToString()
我得到:
办公室托
这是我的登录帐户
对于
System.Web.HttpContext.Current.User.Identity.Name;
我得到了
IIS APPPOOL.NET v4.5 经典版
这是应用程序池正在运行的帐户。
其他答案中提到的所有内容都是真实的,加上这个:
在 IIS 管理器中,单击基本设置。
在“编辑应用程序”窗口中单击“连接为...”
选择应用用户(通过认证)。 不要使用特定用户,因为这将是检测到的身份。
点击项目名称并按F4,将打开项目属性窗口:
启用 Windows 身份验证
禁用匿名身份验证
<identity impersonate="true">
现在,部署您的代码,它应该可以正常工作。
试试这个
(((System.Web.Security.RolePrincipal)(ClaimsPrincipal.Current)).Identity).Name
如果您按如下方式配置 IIS,这将起作用
身份验证 -> ASP.net 模拟 = 已启用
应用程序池在我的例子中是“.net 4.5 classic”,可能会更高。如果未配置:您将收到服务器错误 500
如果两者都配置正确,则 新的 WindowsPrincipal(WindowsIdentity.GetCurrent()) 将返回:Domaim'Username