Comment obtenir l'utilisateur actuel dans ASP.NET MVC


268

Dans un modèle de formulaires, j'avais l'habitude d'obtenir l'utilisateur actuellement connecté en:

Page.CurrentUser

Comment obtenir l'utilisateur actuel dans une classe de contrôleur dans ASP.NET MVC?

Réponses:


266

Si vous devez obtenir l'utilisateur à partir du contrôleur, utilisez la Userpropriété Controller. Si vous en avez besoin depuis la vue, je remplirais ce dont vous avez spécifiquement besoin dans le ViewData, ou vous pouvez simplement appeler User car je pense que c'est une propriété de ViewPage.


2
"ou vous pouvez simplement appeler User car je pense que c'est une propriété de ViewPage" - Vous voulez donc dire utiliser Page.user lorsque vous êtes dans la vue?
mawaldne

17
Oui, vous pouvez l'utiliser comme "Salut, @ User.Identity.Name!" dans le cshtml.
Sean

198

J'ai trouvé que ça Usermarche, c'est-à-dire, User.Identity.Nameou User.IsInRole("Administrator").


19
Juste pour ajouter à cela, si vous travaillez dans une classe en dehors d'un formulaire, vous devrez soit vous Imports System.Webqualifier avec HttpContext.Current.User.Identity.Name, soit vous qualifier directement en utilisant la syntaxe complète:System.Web.HttpContext.Current.User.Identity.Name
Paul

Fonctionne à l'intérieur d'un contrôleur et si vous utilisez un ViewModel, héritez du contrôleur ou suivez la suggestion de Paul.
utileBee

60

Essayez HttpContext.Current.User.

Propriété partagée publique Current () As System.Web.HttpContext
Membre de System.Web.HttpContext

Résumé:
Obtient ou définit l'objet System.Web.HttpContext pour la demande HTTP actuelle.

Valeurs de retour:
System.Web.HttpContext pour la demande HTTP actuelle


2
Apparemment, HttpContext n'a pas de propriété nommée "Current".
Serhat Ozgel

20
Je pense que vous parlez de deux choses différentes. System.Web.HttpContext et la propriété statique: System.Web.Mvc.Controller.HttpContext (qui n'a pas de propriété "Current".
Jeff Sheldon

1
Cela fonctionnait sur un environnement non MVC, exactement ce dont j'avais besoin. Merci! :)
Wagner da Silva

38

Vous pouvez obtenir le nom de l'utilisateur dans ASP.NET MVC4 comme ceci:

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

4
Si vous obtenez cette erreur '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, je vous suggère de faire un appel absolu comme celui-ci System.Web.HttpContext.Current.User.Identity.Name,.
Simple Sandman

21

Je me rends compte que c'est vraiment vieux, mais je ne fais que commencer avec ASP.NET MVC, alors j'ai pensé que je mettrais mes deux cents dans:

  • Request.IsAuthenticated vous indique si l'utilisateur est authentifié.
  • Page.User.Identity vous donne l'identité de l'utilisateur connecté.

16

J'utilise:

Membership.GetUser().UserName

Je ne suis pas sûr que cela fonctionnera dans ASP.NET MVC, mais ça vaut le coup :)


D'où vient cette classe d'adhésion? IntelliSense ne le reconnaît pas par défaut.
Serhat Ozgel

L'espace de noms System.Web.Security. Je ne suis pas certain que cela soit utile dans MVC mais je l'utilise avec les contrôles de connexion pour les formulaires Web.
Sean

1
Il est utile dans toute application ASP.NET qui utilise les fournisseurs d'adhésion.
jamiebarrow

2
Cela fera en fait une demande de base de données. HttpContext.Current.User ne le fait pas.
Mike Cole

11

se connecter nom d'utilisateur: System.Web.HttpContext.Current.User.Identity.Name


9

Afin de référencer un ID utilisateur créé à l'aide d'une authentification simple intégrée à ASP.NET MVC 4 dans un contrôleur à des fins de filtrage (ce qui est utile si vous utilisez d'abord la base de données et Entity Framework 5 pour générer des liaisons de code en premier et que vos tables sont structurées de manière à qu’une clé étrangère de l’ID utilisateur est utilisée), vous pouvez utiliser

WebSecurity.CurrentUserId

une fois que vous avez ajouté une instruction using

using System.Web.Security;

4
Malheureusement, cela ne semble plus fonctionner dans MVC 5. Je ne sais pas pourquoi = /
Jed Grant

2
Fonctionne uniquement System.Security.Principal.WindowsIdentity.GetCurrent().Nameen MVC 5. Cependant, cela tire le nom de domaine avec le nom d'utilisateur. ie domaine \ nom d'utilisateur
shaz

8

Nous pouvons utiliser le code suivant pour obtenir l'utilisateur actuellement connecté dans ASP.Net MVC:

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

Aussi

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

Environment.UserName - Will Display format : 'Username'

7

Nom d'utilisateur avec:

User.Identity.Name

Mais si vous avez besoin d'obtenir uniquement l'ID, vous pouvez utiliser:

using Microsoft.AspNet.Identity;

Ainsi, vous pouvez obtenir directement l'ID utilisateur:

User.Identity.GetUserId();

Cette méthode renvoie un System.Guid
Gilberto B. Terra Jr.

User.Identity.Name est une instance de System.Security.Principal.IPrincipal qui n'a pas de propriété id ... Cet utilisateur est-il différent de l'objet utilisateur de User.Identity.GetUserId
Samra


5

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

Cela obtiendra l'utilisateur Windows actuellement connecté.


1
Bien que ce code puisse répondre à la question, il serait préférable d'inclure du contexte, d'expliquer comment il fonctionne et de décrire quand l'utiliser. Les réponses uniquement codées ne sont pas utiles à long terme.
ryanyuyu

System.Security.Principal.WindowsIdentity.GetCurrent (). Le nom renvoie l'utilisateur actuel connecté à Windows, l'OP demande l'utilisateur actuellement connecté au site Web.
GrandMasterFlush

4

Pour ce que cela vaut, dans ASP.NET MVC 3, vous pouvez simplement utiliser User qui renvoie l'utilisateur pour la demande actuelle.


4

Si vous êtes à l'intérieur de votre page de connexion, dans l'événement LoginUser_LoggedIn par exemple, Current.User.Identity.Name renverra une valeur vide, vous devez donc utiliser votre propriétéLoginControlName.UserName.

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

4

Vous pouvez utiliser le code suivant:

Request.LogonUserIdentity.Name;

Cela vous donne le nom d'utilisateur de l'AppPool sous lequel l'application s'exécute.
Jason Geiger

3
IPrincipal currentUser = HttpContext.Current.User;
bool writeEnable = currentUser.IsInRole("Administrator") ||
        ...
                   currentUser.IsInRole("Operator");

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

Si vous travaillez dans Active Directory sur un intranet, voici quelques conseils:

(Windows Server 2012)

L'exécution de tout ce qui parle à AD sur un serveur Web nécessite beaucoup de changements et de patience. Étant donné que lors de l'exécution sur un serveur Web par rapport à IIS / IIS Express local, il s'exécute dans l'identité de l'AppPool, vous devez donc le configurer pour usurper l'identité de la personne qui accède au site.

Comment obtenir l'utilisateur actuellement connecté dans un répertoire actif lorsque votre application ASP.NET MVC s'exécute sur un serveur Web à l'intérieur du réseau:

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

Vous devez encapsuler tous les appels liés au «contexte de répertoire actif» dans ce qui suit afin qu'il agisse comme environnement d'hébergement pour obtenir les informations AD:

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

Vous devez également avoir impersonatedéfini la valeur true dans votre web.config:

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

Vous devez avoir l'authentification Windows sur dans web.config:

<authentication mode="Windows" />

Je ne le crois pas, car cela utilise explicitement vos informations d'identification d'utilisateur Active Directory. Pourquoi auriez-vous des «formulaires» si vous souhaitez que vos utilisateurs soient authentifiés via AD?
Beau D'Amore

Dans notre organisation, il y a des endroits où nous avons quelques postes de travail qui sont partagés par plusieurs membres du personnel sur le terrain. Pour cette raison, nous devons ajouter la page de connexion à nos applications Web intranet.
Patee Gutee

comme solution de contournement: vous pourriez avoir deux copies de cette application en cours d'exécution, une en mode 'Formulaires' avec ses propres tables d'identité ou vous pouvez mélanger les deux dans une seule application, mais c'est plus délicat. Un rapide Google a révélé ceci: stackoverflow.com/questions/2250921/…
Beau D'Amore

<identity impersonate = "true" /> devra peut-être changer en cas de mixage
Beau D'Amore

2

Dans Asp.net Mvc Identity 2, vous pouvez obtenir le nom d'utilisateur actuel en:

var username = System.Web.HttpContext.Current.User.Identity.Name;

1

Dans le Gestionnaire IIS, sous Authentification, désactivez: 1) Authentification anonyme 2) Authentification par formulaire

Ajoutez ensuite les éléments suivants à votre contrôleur pour gérer les tests par rapport au déploiement du serveur:

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

if (url.Contains("localhost"))
  sUserName = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
else
  sUserName = User.Identity.Name;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.