如何在asp.net中识别impersonate =“true”时获取Windows用户名?

问题描述 投票:43回答:4

我正在创建一个内部网asp.net mvc应用程序,公司中的每个人都应该可以访问它。我需要运行模拟数据库访问的网站等,但我想知道每个用户是谁。

当我看到Page.User.Identity.Name时,它是空白的。即使网站正在模拟运行,是否可以获取用户的Windows帐户名称?

编辑:这里有更多信息。我在IIS 6中有一个运行匿名访问的站点。该站点在可以访问数据库的系统帐户下运行(因为所有员工都无权访问数据库)。

我的web.config有<authentication mode="Windows" /><identity impersonate="true"/>

我的目标是用户不必登录 - 他们登录我们网络的事实(以及该网站不在外部IP上的事实)是足够的身份验证。我想知道用户是谁以跟踪他们所做的更改等。

asp.net-mvc impersonation
4个回答
120
投票

在应用程序中使用<authentication mode="Windows"/>并在IIS中启用匿名访问,您将看到以下结果:

System.Environment.UserName: Computer Name
Page.User.Identity.Name: Blank
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Computer Name 

在应用程序中使用<authentication mode="Windows"/>,并且在IIS中禁用“匿名访问”并且仅“集成Windows身份验证”,您将看到以下结果:

System.Environment.UserName: ASPNET (user account used to run ASP.NET service)
Page.User.Identity.Name: Domain\ Windows Account Name 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Computer Name\ASPNET

在您的应用程序中使用<authentication mode="Windows"/><identity impersonate ="true"/>,并且在IIS中禁用“匿名访问”并且仅“集成Windows身份验证”,您将看到以下结果:

System.Environment.UserName: Windows Account Name 
Page.User.Identity.Name: Domain\ Windows Account Name 
System.Security.Principal.WindowsIdentity.GetCurrent().Name: Domain\ Windows Account Name

6
投票

试试这个

System.Security.Principal.WindowsIdentity.GetCurrent().Name

它应该返回一个包含用户登录名的字符串


1
投票

除非MVC框架下的这个功能已经改变,并且我认为它没有,否则Page.User.Identity.Name仍然可以工作。听起来您的网站设置为允许匿名身份验证。如果是这样,请尝试禁用它。


0
投票

我只是想发布我的修复,因为没有其他人说过任何关于它的事情。

当我将网站发布到服务器时,我遇到了同样的问题,而不是我本地的问题。所有设置都是一样的。但是,在IIS中,“默认网站”从未被关闭过。它正在运行并拦截流量,即使没有与之关联的站点。匿名身份验证在默认情况下已打开,但在我的网站上运行在端口80下关闭。我的网站关闭它似乎并不重要...因为默认设置已打开,所以所有流量都打开了到80号港口。

禁用默认Web修复了该问题。也将端口更改为8080工作。

我希望这可以帮助别人。

© www.soinside.com 2019 - 2024. All rights reserved.