Comment obtenir l'utilisateur actuel, dans le cadre d'une action sécurisée ApiController, sans transmettre le nom d'utilisateur ou l'identificateur d'utilisateur en paramètre?
Nous supposons que cela est disponible, car nous sommes dans une action sécurisée. Être dans une action sécurisée signifie que l'utilisateur est déjà authentifié et que la demande a son jeton porteur. Etant donné que WebApi a autorisé l'utilisateur, il peut exister un moyen intégré d'accéder à l'ID utilisateur, sans qu'il soit nécessaire de le transmettre 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:
string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();
Le secret réside dans le contrôleur de compte généré automatiquement par Webapi2
Avoir cette propriété avec getter définie comme
public string UserIdentity
{
get
{
var user = UserManager.FindByName(User.Identity.Name);
return user;//user.Email
}
}
et pour obtenir UserManager - Dans WebApi2, faites comme Romains (lu comme AccountController)
public ApplicationUserManager UserManager
{
get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
Cela devrait être compatible en IIS et en mode auto-hôte
Aucune des suggestions ci-dessus n'a fonctionné pour moi. Ce qui suit fait!
HttpContext.Current.Request.LogonUserIdentity.Name
Je suppose qu'il existe une grande variété de scénarios et 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. Je devais définir les deux applications à exécuter exclusivement sous 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 accès aux informations d'identification de l'utilisateur à la demande (à partir de IIS je suppose).
La réponse de Karan Bhandari est bonne, mais AccountController ajouté à un projet est très probablement un Mvc.Controller
. Pour convertir sa réponse pour l’utiliser dans ApiController, changez HttpContext.Current.GetOwinContext()
en Request.GetOwinContext()
et assurez-vous d’avoir ajouté les instructions 2 using
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 le IdentityDbContext .
Si jamais vous implémentez une table utilisateur personnalisée et que vous souhaitez authentifier le porteur de jetons, veuillez vérifier ma réponse.
Comment obtenir le contexte utilisateur lors d'appels Web Api?
J'espère que ça aide toujours. :)
string userName;
string 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, sur la base du commentaire de Darrel Miller, utilisez peut-être ceci pour récupérer d'abord le HttpContext.
// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);
Voir également:
Comment accéder à HTTPContext à partir de votre action API Web