34

我想使用 Windows 身份验证获取用户名

实际上我实现了“以不同用户身份登录”,当单击此按钮时,Windows 安全将出现在那里,我们可以提供凭据。

在那个时候,如果我提供其他一些凭据,它只会使用当前用户名。如何从 Windows 安全中获取给定的凭据用户名?

IIS 中的主机应用程序然后禁用匿名身份验证并启用 Windows 身份验证。

网络配置:

<system.web>
    <compilation debug="true" targetFramework="4.0" />
  <identity impersonate="true"/>
  <authorization>
      <allow users="*"/>
      <deny users="*"/>
  </authorization>
</system.web>
<system.webServer>
    <directoryBrowse enabled="true" />
    <security>
        <authentication>
            <anonymousAuthentication enabled="false" />
            <windowsAuthentication enabled="true" />
        </authentication>
    </security>

。CS

在这里,我总是得到默认用户名

string fullName = Request.ServerVariables["LOGON_USER"];

有任何想法吗?提前致谢

4

8 回答 8

40

这些是您可以访问的不同变量及其值,具体取决于 IIS 配置。

场景 1: IIS 中的匿名身份验证关闭模拟。

HttpContext.Current.Request.LogonUserIdentity.Name    SERVER1\IUSR_SERVER1 
HttpContext.Current.Request.IsAuthenticated           False                    
HttpContext.Current.User.Identity.Name                –                        
System.Environment.UserName                           ASPNET                   
Security.Principal.WindowsIdentity.GetCurrent().Name  SERVER1\ASPNET

场景 2: IIS 中的 Windows 身份验证,模拟关闭。

HttpContext.Current.Request.LogonUserIdentity.Name    MYDOMAIN\USER1   
HttpContext.Current.Request.IsAuthenticated           True             
HttpContext.Current.User.Identity.Name                MYDOMAIN\USER1   
System.Environment.UserName                           ASPNET           
Security.Principal.WindowsIdentity.GetCurrent().Name  SERVER1\ASPNET

场景 3: IIS 中的匿名身份验证,模拟

HttpContext.Current.Request.LogonUserIdentity.Name    SERVER1\IUSR_SERVER1 
HttpContext.Current.Request.IsAuthenticated           False                    
HttpContext.Current.User.Identity.Name                –                        
System.Environment.UserName                           IUSR_SERVER1           
Security.Principal.WindowsIdentity.GetCurrent().Name  SERVER1\IUSR_SERVER1 

场景 4: IIS 中的 Windows 身份验证,模拟

HttpContext.Current.Request.LogonUserIdentity.Name    MYDOMAIN\USER1
HttpContext.Current.Request.IsAuthenticated           True          
HttpContext.Current.User.Identity.Name                MYDOMAIN\USER1
System.Environment.UserName                           USER1         
Security.Principal.WindowsIdentity.GetCurrent().Name  MYDOMAIN\USER1

图例
SERVER1\ASPNET:服务器上正在运行的进程的标识。
SERVER1\IUSR_SERVER1:在 IIS 中定义的匿名来宾用户。
MYDOMAIN\USER1:远程客户端的用户。

资源

于 2018-11-26T23:12:15.417 回答
38

您可以通过以下方式在 Windows Authentication 下获取用户的WindowsIdentity对象:

WindowsIdentity identity = HttpContext.Current.Request.LogonUserIdentity;

然后你可以得到关于用户的信息,比如identity.Name。

请注意,这些代码需要有 HttpContext。

于 2013-10-30T08:17:59.897 回答
7

这应该有效:

User.Identity.Name

Identity返回一个IPrincipal

这是 Microsoft文档的链接。

于 2013-10-30T13:02:04.243 回答
3

这取决于应用程序的配置以及 IIS,因为下面链接中的这位先生已正确解释。请看他下面的文章

http://richhewlett.com/2011/02/15/getting-a-users-username-in-asp-net/

于 2015-07-16T15:54:28.150 回答
1

您可以阅读Name来自WindowsIdentity

var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
return Ok(user);
于 2020-03-06T20:22:37.427 回答
0

我认为由于以下代码,您没有获得新的凭证

string fullName = Request.ServerVariables["LOGON_USER"];

您可以尝试自定义登录页面

于 2013-10-30T07:41:18.187 回答
0

你得到的用户名是这样的:

var userName = HttpContext.Current.Request.LogonUserIdentity?.Name;
于 2018-06-21T07:55:11.077 回答
-1

在您的视图页面/_Layout.cshtml 中声明以下代码:

@using System.DirectoryServices.AccountManagement

@{
    var context = new PrincipalContext(ContextType.Domain);
    var principal = UserPrincipal.FindByIdentity(context, User.Identity.Name);
    var userName = @principal.GivenName + " " + @principal.Surname;
}
于 2021-05-04T14:20:55.333 回答