web-dev-qa-db-fra.com

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

  • Comment obtenir l'identifiant 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 de MVC 5 d’assigner des tâches aux utilisateurs? (par exemple, une User devrait avoir Items. Devrais-je stocker la Id de l'utilisateur dans Item? Puis-je étendre la classe User avec une propriété de navigation List<Item>?

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

Essayé ces:

'Membership.GetUser ()' est null.

147
Adam Szabo

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

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Il convient de mentionner que User.Identity.IsAuthenticated et User.Identity.Name fonctionnent sans ajouter l’instruction using mentionnée ci-dessus. Mais GetUserId() ne sera pas présent sans elle. 

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.

Pas encore de meilleure pratique, mais j'ai trouvé des informations utiles sur l'extension du profil de l'utilisateur:

294
Adam Szabo

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.

28
Rok Bermež

Si vous voulez que l'objet ApplicationUser soit dans une ligne de code (si vous avez la dernière identité ASP.NET 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 using suivantes:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
17
firecape

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

Votre deuxième question est cependant un peu plus compliquée.

Il s’agit donc, pour l’instant, de tout ce qui concerne les versions préliminaires, mais le problème commun que vous rencontrez est de savoir si vous étendez l’utilisateur avec de nouvelles propriétés (ou une collection d’éléments dans votre question).

Dès la sortie de la boîte, vous obtiendrez un fichier appelé IdentityModel dans le dossier Modèles (au moment de l'écriture). Là-bas, vous avez deux cours. ApplicationUser et ApplicationDbContext. Pour ajouter votre collection de Items, vous voudrez modifier la classe ApplicationUser, 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 sous le capot, vous constaterez que toutes les classes liées à l'identité (User, Role, etc.) ne sont plus que des POCO avec les annotations de données appropriées, de sorte qu'elles jouent bien avec EF6.

Ensuite, vous devrez apporter quelques modifications au constructeur AccountController 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. 

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

Cette ligne fera le travail et vous pourrez accéder à userWithItems.Items comme vous le souhaitez.

HTH

7
Stimul8d
        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;
0
Hari Lakkakula

si quelqu'un d'autre se trouve dans cette situation: je crée un e-mail de vérification pour me connecter à mon application, de sorte que mes utilisateurs ne sont pas encore connectés. Cependant, j'ai utilisé le formulaire ci-dessous pour rechercher un e-mail saisi lors de la connexion, qui constitue 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;
0
Duan Walker

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

0
Bhupinder Yadav

Je ressens ta douleur, j'essaie 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 ce document, je remplace OnAuthentication et configure le filterContext.HttpContext.User to null 

C'est le meilleur que j'ai réussi jusqu'ici ...

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;
        }
    }
    ...
}
0
Derek Tomes