Vous ne devez pas avoir à interroger la base de données directement pour l'ApplicationUser en cours.
Cela introduit une nouvelle dépendance d'avoir un contexte supplémentaire pour les démarreurs, mais à l'avenir, les tables de base de données utilisateur changent (3 fois au cours des 2 dernières années) mais l'API est cohérente. Par exemple, la users
table est désormais appelée AspNetUsers
dans Identity Framework et les noms de plusieurs champs de clé primaire ne cessent de changer, de sorte que le code dans plusieurs réponses ne fonctionnera plus tel quel .
Un autre problème est que l'accès OWIN sous-jacent à la base de données utilisera un contexte distinct, de sorte que les modifications d'un accès SQL séparé peuvent produire des résultats invalides (par exemple, ne pas voir les modifications apportées à la base de données). Encore une fois, la solution est de travailler avec l'API fournie et de ne pas essayer de la contourner .
La façon correcte d'accéder à l'objet utilisateur actuel dans l'identité ASP.Net (à cette date) est:
var user = UserManager.FindById(User.Identity.GetUserId());
ou, si vous avez une action asynchrone, quelque chose comme:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
nécessite que vous disposiez de l' instruction using suivante pour que les UserManager
méthodes non asynchrones soient disponibles (ce sont des méthodes d'extension pour UserManager, donc si vous ne les incluez pas, vous ne verrez que FindByIdAsync
):
using Microsoft.AspNet.Identity;
Si vous n'êtes pas du tout dans un contrôleur (par exemple, vous utilisez l'injection IOC), l'ID utilisateur est récupéré en entier à partir de:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Si vous n'êtes pas dans le contrôleur de compte standard, vous devrez ajouter les éléments suivants (à titre d'exemple) à votre contrôleur:
1. Ajoutez ces deux propriétés:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Ajoutez ceci dans le constructeur du contrôleur:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Mise à jour mars 2015
Remarque: La mise à jour la plus récente du framework Identity modifie l'une des classes sous-jacentes utilisées pour l'authentification. Vous pouvez maintenant y accéder à partir du contexte Owin du contenu HttpContent actuel.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Addenda:
Lorsque vous utilisez EF et Identity Framework avec Azure, sur une connexion à une base de données distante (par exemple, un test d'hôte local vers une base de données Azure), vous pouvez frapper au hasard la redoutable «erreur: 19 - La connexion physique n'est pas utilisable». Comme la cause est enfouie dans Identity Framework, où vous ne pouvez pas ajouter de nouvelles tentatives (ou ce qui semble être manquant .Include(x->someTable)
), vous devez implémenter une personnalisation SqlAzureExecutionStrategy
dans votre projet.
ApplicationUser
classe (spécifique à l'application) et laAspNetUsers
table en parallèle et ils fourniront de nouveaux champs. Encore une fois: ne frappez pas directement la base de données! :)Mon erreur, je n'aurais pas dû utiliser une méthode dans une requête LINQ.
Code correct:
la source
UserManager
méthodes et ne pas toucher directement la base de données?C'est dans les commentaires des réponses mais personne n'a posté cela comme la vraie solution.
Vous avez juste besoin d'ajouter une instruction using en haut:
la source
using
. Étant donné que 15 000 personnes ont visité la question, j'ai pensé que c'était une réponse utile :).GetUserId()
c'est une méthode d'extensionLe code d'Ellbar fonctionne! Vous avez seulement besoin d'ajouter en utilisant.
1 -
using Microsoft.AspNet.Identity;
Et ... le code d'Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
Avec ce code (in
currentUser
), vous travaillez les données générales de l'utilisateur connecté, si vous voulez des données supplémentaires ... voir ce lienla source
ApplicationUser
objetDepuis ASP.NET Identity 3.0.0, cela a été refactorisé en
la source
la source
Pour MVC 5, regardez simplement à l'intérieur de la méthode EnableTwoFactorAuthentication de ManageController dans l'échafaudage de modèle WebApplication, cela se fait là:
La réponse est là, comme l'a suggéré Microsoft lui-même:
Il aura toutes les propriétés supplémentaires que vous avez définies dans la classe ApplicationUser.
la source
À l'heure actuelle, le modèle de projet asp.mvc crée un contrôleur de compte qui obtient le gestionnaire d'utilisateurs de cette façon:
Ce qui suit fonctionne pour moi:
la source
J'étais disponible pour obtenir l'utilisateur de l'application en suivant le morceau de code
la source
Si quelqu'un travaille avec des
Identity
utilisateursweb forms
, je l'ai fait fonctionner en le faisant:la source