如何在 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 身份验证获取用户名?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ASP.NET 页面获取当前登录的 Windows 帐户?