277

In a forms model, I used to get the current logged-in user by:

Page.CurrentUser

How do I get the current user inside a controller class in ASP.NET MVC?

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Serhat Ozgel
  • 23,496
  • 29
  • 102
  • 138

21 Answers21

273

If you need to get the user from within the controller, use the User property of Controller. If you need it from the view, I would populate what you specifically need in the ViewData, or you could just call User as I think it's a property of ViewPage.

Amirhossein Mehrvarzi
  • 18,024
  • 7
  • 45
  • 70
Haacked
  • 58,045
  • 14
  • 90
  • 114
  • 3
    "or you could just call User as I think it's a property of ViewPage" - So do you mean use Page.user when you're in the view? – mawaldne Nov 28 '09 at 20:14
  • 17
    Yes, you can use it like, "Hi, @User.Identity.Name!" in the cshtml. – Sean Aug 08 '14 at 20:49
210

I found that User works, that is, User.Identity.Name or User.IsInRole("Administrator").

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
  • 24
    Just to add to this, if you're working in a class outside of a form you'll either need to `Imports System.Web` and further qualify with with `HttpContext.Current.User.Identity.Name`, or directly qualify using the full syntax: `System.Web.HttpContext.Current.User.Identity.Name` – Paul Sep 10 '14 at 14:49
  • Works inside a Controller and if using a ViewModel either inherit from Controller or follow Paul's suggestion. – usefulBee Jun 03 '16 at 21:09
62

Try HttpContext.Current.User.

Public Shared Property Current() As System.Web.HttpContext
Member of System.Web.HttpContext

Summary:
Gets or sets the System.Web.HttpContext object for the current HTTP request.

Return Values:
The System.Web.HttpContext for the current HTTP request

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
dove
  • 20,469
  • 14
  • 82
  • 108
39

You can get the name of the user in ASP.NET MVC4 like this:

System.Web.HttpContext.Current.User.Identity.Name
radbyx
  • 9,352
  • 21
  • 84
  • 127
  • 4
    If you are getting this error `'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`, I would suggest making an absolute call like this, `System.Web.HttpContext.Current.User.Identity.Name`. – Simple Sandman Mar 03 '16 at 16:46
21

I realize this is really old, but I'm just getting started with ASP.NET MVC, so I thought I'd stick my two cents in:

  • Request.IsAuthenticated tells you if the user is authenticated.
  • Page.User.Identity gives you the identity of the logged-in user.
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
jrb
  • 381
  • 3
  • 6
16

I use:

Membership.GetUser().UserName

I am not sure this will work in ASP.NET MVC, but it's worth a shot :)

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Sean
  • 2,453
  • 6
  • 41
  • 53
11

getting logged in username: System.Web.HttpContext.Current.User.Identity.Name

tifoz
  • 171
  • 1
  • 5
10

UserName with:

User.Identity.Name

But if you need to get just the ID, you can use:

using Microsoft.AspNet.Identity;

So, you can get directly the User ID:

User.Identity.GetUserId();
9

In order to reference a user ID created using simple authentication built into ASP.NET MVC 4 in a controller for filtering purposes (which is helpful if you are using database first and Entity Framework 5 to generate code-first bindings and your tables are structured so that a foreign key to the userID is used), you can use

WebSecurity.CurrentUserId

once you add a using statement

using System.Web.Security;
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
MattC
  • 134
  • 1
  • 3
  • 4
    Unfortunately this doesn't seem to work anymore in MVC 5. Not sure why =/ – Jed Grant Aug 09 '13 at 17:55
  • 3
    Only `System.Security.Principal.WindowsIdentity.GetCurrent().Name` works in `MVC 5`. However that pulls up the domain name with the username. i.e. domain\username – PineCone Aug 08 '16 at 14:00
9

We can use following code to get the current logged in User in ASP.Net MVC:

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

Also

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

Environment.UserName - Will Display format : 'Username'
Raj Baral
  • 661
  • 6
  • 19
  • hi @rajbaral This worked for me, what if i want to extract the other information from the current user from the db, example address field. – rickyProgrammer Sep 24 '20 at 13:58
  • @rickyProgrammer you need to write a method to get UserProfile from your AD using that `userName` – Raj Baral Oct 01 '20 at 20:12
  • var userName = System.Security.Principal.WindowsIdentity.GetCurrent().Name; This is just straight up incorrect information. This call will get you the identity of the Application Pool and not of the web user. – Lemiarty Apr 26 '22 at 21:17
6

This page could be what you looking for:
Using Page.User.Identity.Name in MVC3

You just need User.Identity.Name.

Community
  • 1
  • 1
heriawan
  • 146
  • 1
  • 4
5

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

This will get the current logged-in Windows user.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Clay Smith
  • 1,051
  • 14
  • 27
  • 1
    While this code may answer the question, it would be better to include some context, explain how it works, and describe when to use it. Code-only answers are not useful in the long run. – ryanyuyu Aug 17 '15 at 19:44
  • System.Security.Principal.WindowsIdentity.GetCurrent().Name returns the current user logged into Windows, the OP is asking for the user currently logged into the web site. – GrandMasterFlush Aug 19 '15 at 08:32
4

You can use following code:

Request.LogonUserIdentity.Name;
Raj Baral
  • 661
  • 6
  • 19
Rajeev Jayaswal
  • 1,423
  • 1
  • 20
  • 22
4

For what it's worth, in ASP.NET MVC 3 you can just use User which returns the user for the current request.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Pieter
  • 2,188
  • 20
  • 27
4

If you are inside your login page, in LoginUser_LoggedIn event for instance, Current.User.Identity.Name will return an empty value, so you have to use yourLoginControlName.UserName property.

MembershipUser u = Membership.GetUser(LoginUser.UserName);
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
live-love
  • 48,840
  • 22
  • 240
  • 204
3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");
Christian Specht
  • 35,843
  • 15
  • 128
  • 182
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));
Ognyan Dimitrov
  • 6,026
  • 1
  • 48
  • 70
2

If you happen to be working in Active Directory on an intranet, here are some tips:

(Windows Server 2012)

Running anything that talks to AD on a web server requires a bunch of changes and patience. Since when running on a web server vs. local IIS/IIS Express it runs in the AppPool's identity so, you have to set it up to impersonate whoever hits the site.

How to get the current logged-in user in an active directory when your ASP.NET MVC application is running on a web server inside the network:

// 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...

You must wrap any calls having to do with 'active directory context' in the following so it's acting as the hosting environment to get the AD information:

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

You must also have impersonate set to true in your web.config:

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

You must have Windows authentication on in web.config:

<authentication mode="Windows" />
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Beau D'Amore
  • 3,174
  • 5
  • 24
  • 56
  • I do not believe so, as this is explicitly using your Active Directory user credentials. Why would you have 'Forms' if you desire your users to be authenticated via AD? – Beau D'Amore Oct 24 '16 at 13:39
  • In our organization, there are locations where we have a couple of workstations that are shared by several "field" personnel. Because of that, we are required to add the login page to our intranet web applications. – Patee Gutee Oct 24 '16 at 14:04
  • as a workaround: you could have two copies of this app running, one in 'Forms' mode with it's own identity tables or you can mix both in one app, but it's trickier. A quick google revealed this: http://stackoverflow.com/questions/2250921/mixing-forms-authentication-with-windows-authentication – Beau D'Amore Oct 24 '16 at 14:54
  • might need to change if mixing – Beau D'Amore Oct 24 '16 at 14:55
2

In Asp.net Mvc Identity 2,You can get the current user name by:

var username = System.Web.HttpContext.Current.User.Identity.Name;
fbarikzehy
  • 4,885
  • 2
  • 33
  • 39
1

In the IIS Manager, under Authentication, disable: 1) Anonymous Authentication 2) Forms Authentication

Then add the following to your controller, to handle testing versus server deployment:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
Daniel King
  • 126
  • 1
  • 4
1

If any one still reading this then, to access in cshtml file I used in following way.

<li>Hello @User.Identity.Name</li>
Samif
  • 57
  • 8