如何在ASP.NET MVC中获取当前用户


Answers:


266

如果需要从控制器内部获取用户,请使用UserController 的属性。如果您从视图中需要它,则可以在中特别填充您所需要的东西ViewData,或者您可以直接调用User,因为我认为它是的属性ViewPage


2
“或者您可以调用User,因为我认为它是ViewPage的属性”-那么您是说在视图中使用Page.user吗?
mawaldne

17
是的,您可以像“嗨,@ User.Identity.Name!”那样使用它。在cshtml中。
肖恩

198

我发现这User可行,即User.Identity.NameUser.IsInRole("Administrator")


19
只是要补充一点,如果您在表格之外的课程中工作,则需要Imports System.Web进一步使用进行限定HttpContext.Current.User.Identity.Name,或者直接使用完整语法进行限定:System.Web.HttpContext.Current.User.Identity.Name
Paul

在Controller内工作,并且如果使用ViewModel继承自Controller或遵循Paul的建议。
有用蜜蜂

60

尝试HttpContext.Current.User

公共共享属性Current()作为System.Web.HttpContext的System.Web.HttpContext的
成员

摘要:
获取或设置当前HTTP请求的System.Web.HttpContext对象。

返回值:
当前HTTP请求的System.Web.HttpContext


2
显然,HttpContext没有名为“ Current”的属性。
Serhat Ozgel

20
我相信你们两个在谈论两个不同的话题。System.Web.HttpContext和静态属性:System.Web.Mvc.Controller.HttpContext(不具有“当前”属性
杰夫·谢尔登

1
那正是我需要的在非MVC环境下工作的结果。谢谢!:)
Wagner da Silva

38

您可以像这样在ASP.NET MVC4中获取用户名:

System.Web.HttpContext.Current.User.Identity.Name

4
如果出现此错误'System.Web.HttpContextBase' does not contain a definition for 'Current' and no extension method 'Current' accepting a first argument of type 'System.Web.HttpContextBase' could be found,建议您像这样进行绝对调用System.Web.HttpContext.Current.User.Identity.Name
Simple Sandman

21

我意识到这确实很老,但是我刚开始使用ASP.NET MVC,所以我认为我要花两分钱:

  • Request.IsAuthenticated 告诉您用户是否已通过身份验证。
  • Page.User.Identity 为您提供登录用户的身份。

16

我用:

Membership.GetUser().UserName

我不确定这是否可以在ASP.NET MVC中使用,但值得一试:)


会员级别来自哪里?默认情况下,IntelliSense无法识别它。
Serhat Ozgel

System.Web.Security命名空间。我不太肯定这在MVC中很有用,但我将其与Web窗体的登录控件一起使用。
肖恩

1
在使用成员资格提供程序的任何ASP.NET应用程序中,它都非常有用。
jamiebarrow

2
这实际上将发出数据库请求。HttpContext.Current.User没有。
Mike Cole

11

登录用户名: System.Web.HttpContext.Current.User.Identity.Name


9

为了引用用户ID,该ID是使用控制器中的ASP.NET MVC 4内置的简单身份验证创建的,以进行过滤(如果您先使用数据库,而Entity Framework 5则生成代码优先的绑定,并且表的结构如此,这将很有帮助(使用userID的外键),则可以使用

WebSecurity.CurrentUserId

一旦添加using语句

using System.Web.Security;

4
不幸的是,这似乎在MVC 5中不再起作用。不确定为什么= /
Jed Grant

2
System.Security.Principal.WindowsIdentity.GetCurrent().Name适用于MVC 5。但是,这会拉起带有用户名的域名。即domain \ username
shaz

8

我们可以使用以下代码来获取当前在ASP.Net MVC中登录的用户:

var user= System.Web.HttpContext.Current.User.Identity.GetUserName();

var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; //will give 'Domain//UserName'

Environment.UserName - Will Display format : 'Username'

7

用户名:

User.Identity.Name

但是,如果您只需要获取ID,则可以使用:

using Microsoft.AspNet.Identity;

因此,您可以直接获取用户ID:

User.Identity.GetUserId();

此方法返回System.Guid
Gilberto B. Terra Jr.

User.Identity.Name是不具有id属性的System.Security.Principal.IPrincipal的实例...此用户是否不同于User.Identity.GetUserId的用户对象
Samra


5

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

这将获得当前登录的Windows用户。


1
尽管此代码可以回答问题,但最好包含一些上下文,解释其工作原理并描述何时使用它。从长远来看,纯代码答案没有用。
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent()。Name返回登录到Windows的当前用户,OP询问当前登录到网站的用户。
GrandMasterFlush

4

对于它的价值,在ASP.NET MVC 3中,您可以仅使用User,它返回当前请求的用户。


4

如果您在登录页面内,则在LoginUser_LoggedIn事件中,例如Current.User.Identity.Name将返回一个空值,因此您必须使用yourLoginControlName.UserName属性。

MembershipUser u = Membership.GetUser(LoginUser.UserName);



2
var ticket = FormsAuthentication.Decrypt(
                    HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName].Value);

if (ticket.Expired)
{
    throw new InvalidOperationException("Ticket expired.");
}

IPrincipal user =  (System.Security.Principal.IPrincipal) new RolePrincipal(new FormsIdentity(ticket));

2

如果您恰好在Intranet上的Active Directory中工作,请参考以下提示:

(Windows Server 2012)

在Web服务器上运行与AD对话的任何内容都需要进行大量更改和耐心等待。由于在Web服务器与本地IIS / IIS Express上运行时,它以AppPool的身份运行,因此,您必须对其进行设置以冒用任何人访问该网站。

当您的ASP.NET MVC应用程序在网络内部的Web服务器上运行时,如何在活动目录中获取当前登录用户:

// Find currently logged in user
UserPrincipal adUser = null;
using (HostingEnvironment.Impersonate())
{
    var userContext = System.Web.HttpContext.Current.User.Identity;
    PrincipalContext ctx = new PrincipalContext(ContextType.Domain, ConfigurationManager.AppSettings["AllowedDomain"], null,
                                                ContextOptions.Negotiate | ContextOptions.SecureSocketLayer);
    adUser = UserPrincipal.FindByIdentity(ctx, userContext.Name);
}
//Then work with 'adUser' from here...

您必须在下面包装与“活动目录上下文”有关的所有调用,以便将其用作获取AD信息的托管环境:

using (HostingEnvironment.Impersonate()){ ... }

您还必须impersonate在web.config中将其设置为true:

<system.web>
    <identity impersonate="true" />

您必须在web.config中启用Windows身份验证:

<authentication mode="Windows" />

我不这么认为,因为这明确使用了您的Active Directory用户凭据。如果您希望通过AD对用户进行身份验证,为什么会有“表格”?
Beau D'Amore

在我们的组织中,有些地方我们有几个工作站,这些工作站由几个“现场”人员共享。因此,我们需要将登录页面添加到我们的Intranet Web应用程序中。
Patee Gutee

一种解决方法:您可以运行此应用程序的两个副本,一个在“表单”模式下运行,同时具有自己的身份表,或者可以将两个副本混合在一个应用程序中,但这比较麻烦。快速谷歌发现这样的:stackoverflow.com/questions/2250921/...
博D'Amore的

如果混合使用<identity impersonate =“ true” />可能需要更改
Beau D'Amore


1

在IIS管理器的“身份验证”下,禁用:1)匿名身份验证2)表单身份验证

然后将以下内容添加到您的控制器中,以处理测试与服务器部署:

string sUserName = null;
string url = Request.Url.ToString();

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.