Comment obtenir l'utilisateur actuel et comment utiliser la classe utilisateur dans MVC5?

159
  • Comment puis-je obtenir l'ID de l'utilisateur actuellement connecté dans MVC 5 ? J'ai essayé les suggestions StackOverflow, mais elles ne semblent pas être pour MVC 5.
  • En outre, quelle est la meilleure pratique MVC 5 pour attribuer des éléments aux utilisateurs? (par exemple un Userdevrait avoir Items. Dois-je stocker l'utilisateur Iddans Item? Puis-je étendre la Userclasse avec une List<Item>propriété de navigation?

J'utilise "Comptes d'utilisateurs individuels" du modèle MVC.

J'ai essayé ceux-ci:

'Membership.GetUser ()' est nul.

Adam Szabo
la source
Ajout des références de ce que j'ai essayé. Le dernier était OK dans MVC4 mais pas dans MVC5. J'ai aussi besoin de quelques bonnes pratiques pour "utiliser l'utilisateur" :)
Adam Szabo
Lorsque vous dites que vous utilisez MVC 5, qu'utilisez-vous pour devenir membre? OWin.Security?
Aron
"Comptes d'utilisateurs individuels" du modèle MVC.
Adam Szabo
3
HttpContext.Current.User.Identity.Nameest le nom de l'utilisateur actuellement connecté.
Wiktor Zychla
1
Comment obtenir l' identifiant ? Je voudrais attribuer l'utilisateur actuel à celui Itemqu'il crée, mais pas en fonction du nom d'utilisateur (cela pourrait changer). Cela ne fonctionne pas par la façon dont `HttpContext.Current 'System.Web.HttpContextBase' ne contient pas de définition pour 'Current' et aucune méthode d'extension 'Current' acceptant un premier argument de type 'System.Web.HttpContextBase' n'a pu être trouvée ( vous manque une directive using ou une référence d'assembly?) `. Êtes-vous sûr que votre solution est pour MVC 5?
Adam Szabo

Réponses:

313

Si vous codez dans un contrôleur ASP.NET MVC, utilisez

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Il convient de le mentionner User.Identity.IsAuthenticatedet User.Identity.Namefonctionnera sans ajouter la usingdéclaration mentionnée ci-dessus . Mais GetUserId()je ne serai pas présent sans cela.

Si vous êtes dans une classe autre qu'un contrôleur, utilisez

HttpContext.Current.User.Identity.GetUserId();

Dans le modèle par défaut de MVC 5, l'ID utilisateur est un GUID stocké sous forme de chaîne.

Aucune bonne pratique pour le moment, mais j'ai trouvé des informations précieuses sur l'extension du profil utilisateur:

Adam Szabo
la source
9
L'authentification et l'autorisation des utilisateurs ont changé pour ASP.NET MVC 5. Il s'agit désormais d'une authentification basée sur les revendications avec des interfaces et des référentiels génériques que vous pouvez utiliser avec EF ou un autre fournisseur (l'implémentation EF est par défaut). Depuis GetUserIdest une méthode d'extension stockée au bas de Ass_Start\IdentityConfig.cs, partout où vous avez besoin de l'utiliser, si sur un espace de noms différent, vous devrez définir le using Microsoft.AspNet.Identitypour que l'extension devienne visible.
Anderson Matos
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Si j'ajoute la référence utilisateur, l'utilisateur est toujours souligné en rouge? Pourquoi cela serait-il?
Zapnologica
@Zapnologica: essayez de reconstruire le projet, peut-être que VS IntelliSense est un peu lent.
Adam Szabo
5
REMARQUE L'utilisateur n'est disponible que dans un contrôleur msdn.microsoft.com/en-us/library/… (@Zapnologica l'utilisez-vous en dehors d'un contrôleur? Essayez HttpContext.Current.User.Identity.GetUserId ();)
Adween
28

Essayez quelque chose comme:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Fonctionne avec RTM.

Rok Bermež
la source
11
Il impose un voyage de base de données inutile.
Arash
3
@Arash, comment l'application est-elle censée récupérer l'objet de l'utilisateur sans contacter la base de données?
fabspro
2
@Arash tant pis, je vois ce que tu veux dire. L'ID peut être récupéré avec User.Identity.GetUserId (); sans aucun voyage de base de données.
fabspro
Rappelez-vous avec mvc5 (appartenance 2): User.Identity.GetUserId () est différent avec l'ID dans la table [AspNetUsers]. Donc Jakub Arnold et Rok sont dans le bon sens
Grey Wolf
Je suis un peu confus avec la réponse. Je reçois un type UserStore ne semble pas exister dans mon contexte de contrôleur. Des idées?
Jhourlad Estrella
19

Si vous souhaitez que l'objet ApplicationUser se trouve dans une ligne de code (si la dernière identité ASP.NET est installée), essayez:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Vous aurez besoin des instructions d'utilisation suivantes:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
coupe-feu
la source
Objet introuvable pour <ApplicationUserManager>
Fandango68
7

Obtenir l'identifiant est assez simple et vous avez résolu cela.

Votre deuxième question est cependant un peu plus complexe.

Donc, ce sont toutes des choses d'avant-première pour le moment, mais le problème commun auquel vous êtes confronté est celui où vous étendez l'utilisateur avec de nouvelles propriétés (ou une collection d'éléments en question).

Hors de la boîte, vous obtiendrez un fichier appelé IdentityModeldans le dossier Models (au moment de la rédaction). Là-dedans, vous avez quelques cours; ApplicationUseret ApplicationDbContext. Pour ajouter votre collection de, Itemsvous souhaiterez modifier la ApplicationUserclasse, comme vous le feriez s'il s'agissait d'une classe normale que vous utilisiez avec Entity Framework. En fait, si vous jetez un coup d'œil rapide sous le capot, vous constaterez que toutes les classes liées à l'identité (utilisateur, rôle, etc.) ne sont plus que des POCO avec les annotations de données appropriées afin qu'elles fonctionnent bien avec EF6.

Ensuite, vous devrez apporter des modifications au AccountControllerconstructeur afin qu'il sache utiliser votre DbContext.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Maintenant, obtenir l'objet utilisateur complet pour votre utilisateur connecté est un peu ésotérique pour être honnête.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Cette ligne fera le travail et vous pourrez y accéder userWithItems.Itemscomme vous le souhaitez.

HTH

EightyOne Unite
la source
Je suppose qu'il n'y a rien comme des documents de pré-version pour tout cela est-il là?
Derek Tomes
@Derek Tomes - Pas que je connaisse. Je pense que nous devrons attendre le 13 novembre pour de vrais documents. Ce n'est pas génial pour être honnête, il y a même une demande de meilleurs conseils sur uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
ok mais comment accéder à une instance de type AccountController?
nid
0

Je ressens ta douleur, j'essaye de faire la même chose. Dans mon cas, je veux juste effacer l'utilisateur.

J'ai créé une classe de contrôleur de base dont tous mes contrôleurs héritent. Dans celui-ci, je remplace OnAuthenticationet règle lefilterContext.HttpContext.User to null

C'est le mieux que j'ai réussi jusqu'à présent ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}
Derek Tomes
la source
0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;
Hari Lakkakula
la source
Merci de ne pas simplement poster du code, surtout pas sans commentaires. Si vous expliquez votre code, ce serait plus utile.
Ali Kanat
0

si quelqu'un d'autre a cette situation: je crée une vérification d'e-mail pour me connecter à mon application afin que mes utilisateurs ne soient pas encore connectés, mais j'ai utilisé ce qui suit pour vérifier un e-mail entré lors de la connexion, qui est une variante de la solution @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

vous aurez également besoin des éléments suivants:

using Microsoft.AspNet.Identity;

et

using Microsoft.AspNet.Identity.Owin;
Duan Walker
la source
0

Dans .Net MVC5 core 2.2, j'utilise HttpContext.User.Identity.Name. Cela a fonctionné pour moi.

Bhupinder Yadav
la source
0

C'est ainsi que j'ai obtenu un identifiant AspNetUser et l'ai affiché sur ma page d'accueil

J'ai placé le code suivant dans ma méthode HomeController Index ()

ViewBag.userId = User.Identity.GetUserId();

Dans la page d'affichage, il suffit d'appeler

ViewBag.userId 

Exécutez le projet et vous pourrez voir votre userId

kelvin nyadzayo
la source