如何在 asp.net 中使用 Windows 身份验证获取用户名?

Posted

技术标签:

【中文标题】如何在 asp.net 中使用 Windows 身份验证获取用户名?【英文标题】:How to get user name using Windows authentication in asp.net? 【发布时间】:2013-11-09 16:13:19 【问题描述】:

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

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

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

在 IIS 中托管应用程序,然后禁用匿名身份验证并启用 Windows 身份验证。

web.config:

<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"];

有什么想法吗?提前致谢

【问题讨论】:

【参考方案1】:

这些是您可以访问的不同变量及其值,具体取决于 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:远程客户端的用户。

Source

【讨论】:

从@KaushikGhosh 提供的链接中完全剽窃。 ***.com/a/31459055/4821032 服务器上正在运行的进程的身份呢?是否必须将其定义为“经过身份验证的用户”?请对此进行详细说明。 我不明白你的意思。您能否发布一个新问题并将其链接形成评论?我会看看它。 :-)【参考方案2】:

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

WindowsIdentity identity = HttpContext.Current.Request.LogonUserIdentity;

然后您可以获取有关用户的信息,例如identity.Name。

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

【讨论】:

感谢您的回复...我试过了,但没有用...如果我在 Windows 安全性中输入错误密码,它会如何解决这个问题? 您的意思是在 Windows Auth 对话框中输入了错误的密码?它不应该让你通过身份验证。【参考方案3】:

这应该可行:

User.Identity.Name

Identity 返回一个IPrincipal

这里是微软documentation的链接。

【讨论】:

【参考方案4】:

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

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

【讨论】:

虽然它没有直接回答这个问题并且实际上是一个“仅链接”问题,但它确实是一本好书。也许有人可以写一个正确的答案,我们接受它?【参考方案5】:

您可以从WindowsIdentity 读取Name

var user = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
return Ok(user);

【讨论】:

你得到服务器上正在运行的进程的身份了吗? 这仅在您使用模拟时有效。另见docs.microsoft.com/en-us/previous-versions/aspnet/…。如果您有理由这样做,那么它是正确的,但否则,您可能不应该使用模仿。【参考方案6】:

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

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

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

【讨论】:

我的意思是设计新的登录页面。您可以尝试使用 Windows 身份验证进行活动目录身份验证。您在哪个浏览器上运行您的页面? 自定义登录页面示例? 同HttpContext.Current.Request.LogonUserIdentity?.Name; ?【参考方案7】:

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

var userName = HttpContext.Current.Request.LogonUserIdentity?.Name;

【讨论】:

【参考方案8】:

在您的视图页面/_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;

【讨论】:

以上是关于如何在 asp.net 中使用 Windows 身份验证获取用户名?的主要内容,如果未能解决你的问题,请参考以下文章

Membership 介绍

如何从 ASP.NET 页面获取当前登录的 Windows 帐户?

如何在asp.net中获取windows认证用户的用户名?

如何在 asp.net 应用程序中注销按钮 Windows 身份验证

Windows 身份验证 Asp.net 知道如何

asp.net中数据库用Windows模式,后台该如何连接