我继承了一个旧的asp.net网络应用程序。登录过程的一部分旨在收集Windows用户名(而不是过程用户名)。曾经可以使用(几年前),但是系统的新编译会返回应用程序池名称/用户名,而不是Windows用户名。
用户名是在网站认证之前收集的,最初使用HttpContext.Current.User.Identity.Name 我尝试了所有其他建议的选项,但结果没有变化。
string loginName;
loginName = Environment.UserName;
loginName = System.Windows.Forms.SystemInformation.UserName;
loginName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
loginName = HttpContext.Current.User.Identity.Name;
loginName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
loginName = System.Windows.Forms.SystemInformation.UserName;
loginName = System.DirectoryServices.AccountManagement.UserPrincipal.Current.SamAccountName;
loginName = System.DirectoryServices.AccountManagement.UserPrincipal.Current.UserPrincipalName;
我一次尝试了一次(并非全部尝试),并且在目标环境中只获得了应用程序池名称或应用程序池用户名。 我已经尝试过IIS中身份验证的每种组合,唯一起作用的是ASP.NET模拟,它从应用程序池名称更改为模拟用户名。
在从Visual Studio启动的本地PC上,它们都可以返回登录的Windows用户名。
我对asp.net网络应用程序还很陌生,而且我不知道还能尝试什么。
答案 0 :(得分:0)
您偶然发现了答案。如果希望服务器自动认识Windows用户,则需要将该Windows用户的凭据传递给应用程序。如果使用Kerberos或NTML身份验证选项(Windows身份验证),则会自动传递一组凭据。否则,您需要提示用户输入凭据。您不必使用模拟,但是如果您的应用程序池用户具有对dc目录的足够访问权限,则可以以编程方式模拟已登录的用户。这里的更多信息:https://docs.microsoft.com/en-us/previous-versions/msp-n-p/ff647405(v=pandp.10)#impersonating-the-original-caller-programmatically