Obtenir l’utilisateur actuel, dans une action ApiController, sans passer l’ID utilisateur en tant que paramètre

Comment pouvons-nous obtenir l’utilisateur actuel, dans une action ApiController sécurisée, sans passer le nom d’utilisateur ou userId en tant que paramètre?

Nous supposons que cela est disponible, car nous sums dans une action sécurisée. Être dans une action sécurisée signifie que l’utilisateur s’est déjà authentifié et que la demande a son jeton porteur. Étant donné que WebApi a autorisé l’utilisateur, il peut exister un moyen intégré d’accéder à l’ID utilisateur, sans avoir à le passer en tant que paramètre d’action.

Dans WebApi 2, vous pouvez utiliser RequestContext.Principal depuis une méthode sur ApiController

Vous pouvez également accéder au principal en utilisant la propriété User sur ApiController .

Donc, les deux déclarations suivantes sont fondamentalement les mêmes:

 ssortingng id; id = User.Identity.GetUserId(); id = RequestContext.Principal.Identity.GetUserId(); 

L’indice réside dans le contrôleur de compte généré automatiquement par Webapi2

Avoir cette propriété avec getter défini comme

 public ssortingng UserIdentity { get { var user = UserManager.FindByName(User.Identity.Name); return user;//user.Email } } 

et pour obtenir UserManager – Dans WebApi2 -do en tant que Romans (lire AccountController) faire

 public ApplicationUserManager UserManager { get { return HttpContext.Current.GetOwinContext().GetUserManager(); } } 

Cela devrait être compatible en mode IIS et auto-hôte

La réponse de Karan Bhandari est bonne, mais le AccountController ajouté dans un projet est très probablement un Mvc.Controller . Pour convertir sa réponse afin de l’utiliser dans un ApiController, changez HttpContext.Current.GetOwinContext() en Request.GetOwinContext() et assurez-vous d’avoir ajouté les 2 instructions suivantes:

 using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; 

Dans .Net Core, utilisez User.Identity.Name pour obtenir la revendication de nom de l’utilisateur.

Si vous utilisez Asp.Identity UseManager, il définit automatiquement la valeur de

RequestContext.Principal.Identity.GetUserId ()

basé sur IdentityUser que vous utilisez pour créer IdentityDbContext .

Si vous implémentez une table utilisateur personnalisée et une authentification par support de jeton, vérifiez bien ma réponse.

Comment obtenir le contexte utilisateur lors des appels Web Api?

J’espère que ça aide encore. 🙂

Aucune des suggestions ci-dessus n’a fonctionné pour moi. Le suivant a fait!

 HttpContext.Current.Request.LogonUserIdentity.Name 

Je suppose qu’il y a une grande variété de scénarios et que celui-ci a fonctionné pour moi. Mon scénario impliquait une interface AngularJS et une application backend Web API 2, toutes deux exécutées sous IIS. J’ai dû configurer les deux applications pour qu’elles s’exécutent exclusivement sous l’authentification Windows.

Pas besoin de transmettre des informations utilisateur. Le navigateur et IIS échangent les informations d’identification de l’utilisateur connecté et l’API Web a access aux informations d’identification de l’utilisateur à la demande (d’après IIS, je suppose).

 ssortingng userName; ssortingng userId; if (HttpContext.Current != null && HttpContext.Current.User != null && HttpContext.Current.User.Identity.Name != null) { userName = HttpContext.Current.User.Identity.Name; userId = HttpContext.Current.User.Identity.GetUserId(); } 

Ou basé sur le commentaire de Darrel Miller, peut-être utiliser ceci pour récupérer le HttpContext en premier.

 // get httpContext object httpContext; actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext); 

Voir également:

Comment accéder à HTTPContext depuis votre action d’API Web