162 votes

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

  • Comment puis-je obtenir l'identifiant de l'utilisateur actuellement connecté dans la base de données de l'entreprise ? MVC 5 ? J'ai essayé les suggestions de StackOverflow, mais elles semblent ne pas être pour MVC 5.
  • Par ailleurs, quelle est la meilleure pratique de MVC 5 pour attribuer des éléments aux utilisateurs ? (par exemple, un User aurait dû Items . Dois-je stocker les données de l'utilisateur Id sur Item ? Puis-je étendre le User avec une classe List<Item> propriété de navigation ?

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

J'ai essayé ça :

Membership.GetUser()' est nul.

0 votes

J'ai ajouté les références de ce que j'ai essayé. La dernière était OK dans MVC4 mais pas dans MVC5. J'ai également besoin d'une meilleure pratique de "l'utilisation de l'utilisateur" :)

0 votes

Lorsque vous dites que vous utilisez MVC 5, qu'utilisez-vous pour l'adhésion ? OWin.Security ?

0 votes

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

319voto

user2270404 Points 1882

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 fonctionnera sans ajouter l'élément mentionné ci-dessus using déclaration. 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 précieuses sur l'extension du profil de l'utilisateur :

10 votes

L'authentification et l'autorisation des utilisateurs ont changé pour ASP.NET MVC 5. Il s'agit maintenant d'une authentification basée sur les réclamations 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 fournie par défaut). Depuis GetUserId est une méthode d'extension stockée au bas de Ass_Start\IdentityConfig.cs Si vous vous trouvez dans un espace de nom différent, vous devrez définir l'attribut using Microsoft.AspNet.Identity pour que l'extension devienne visible.

1 votes

survey.UserId = Guid.Parse(User.Identity.GetUserId()) ;

0 votes

Si j'ajoute la référence using User est toujours souligné en rouge ? Pourquoi cela ?

28voto

Rok Bermež Points 59

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.

11 votes

Il impose un déplacement inutile de la base de données.

3 votes

@Arash, comment l'application est-elle censée obtenir l'objet de l'utilisateur sans contacter la base de données ?

2 votes

@Arash ça ne fait rien, je vois ce que vous voulez dire. L'ID peut être récupéré avec User.Identity.GetUserId() ; sans aucun déplacement de la base de données.

7voto

Stimul8d Points 4730

Obtenir l'identité est assez simple et vous avez résolu ce problème.

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

Il ne s'agit que d'une version préliminaire pour l'instant, mais le problème commun auquel vous êtes confrontés est que vous étendez l'utilisateur avec de nouvelles propriétés (ou une collection d'éléments dans votre cas).

Vous obtiendrez un fichier appelé IdentityModel sous le dossier Models (au moment de la rédaction). Vous y trouverez deux classes ; ApplicationUser et ApplicationDbContext . Pour ajouter votre collection de Items vous voudrez modifier le ApplicationUser comme vous le feriez s'il s'agissait d'une classe normale que vous utilisez avec Entity Framework. En fait, si vous jetez un rapide coup d'oeil sous le capot, vous constaterez que toutes les classes liées à l'identité (User, Role etc...) sont juste des POCOs maintenant avec les annotations de données appropriées afin qu'elles soient compatibles avec EF6.

Ensuite, vous devrez apporter quelques modifications à la section AccountController pour 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 l'affaire et vous pourrez accéder à userWithItems.Items comme vous le souhaitez.

HTH

0 votes

Je suppose qu'il n'existe pas de document de préversion pour tout cela, n'est-ce pas ?

0 votes

@Derek Tomes - Pas à ma connaissance. Je pense que nous devrons attendre le 13 novembre pour avoir de vrais documents. Pour être honnête, ce n'est pas génial, il y a même une demande pour de meilleurs conseils sur uservoice aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/

0 votes

ok mais comment puis-je obtenir une instance de type AccountController ?

0voto

Derek Tomes Points 2356

Je ressens votre 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 cette classe, je surcharge OnAuthentication et définir les filterContext.HttpContext.User to null

C'est le mieux que j'ai pu faire 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;
        }
    }
    ...
}

-4voto

Andrey.Gubal Points 1629

Essayez ça :

var user = Membership.GetUser(User.Identity.Name);
Guid currentUserID = (Guid)user.ProviderUserKey;

Ça marche pour moi.

Quelle est la meilleure pratique de MVC 5 pour attribuer des éléments aux utilisateurs ?

Je procède de la manière que vous avez mentionnée - ajouter l'ID utilisateur dans la classe de l'élément. C'est la méthode la plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X