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?

Serhat Ozgel
la source

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.

Piraté
la source
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").

Peter Mortensen
la source
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

Colombe
la source
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
radbyx
la source
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é.
jrb
la source
16

J'utilise:

Membership.GetUser().UserName

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

Sean
la source
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

tifoz
la source
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;
MattC
la source
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'
Raj Baral
la source
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();
Gilberto B. Terra Jr.
la source
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é.

Clay Smith
la source
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.

Pieter
la source
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);
l'amour en direct
la source
4

Vous pouvez utiliser le code suivant:

Request.LogonUserIdentity.Name;
Rajeev Jayaswal
la source
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");
Gediminas Bukauskas
la source
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
la source
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" />
Beau D'Amore
la source
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;
Fereydoon Barikzehy
la source
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;
Daniel King
la source