web-dev-qa-db-fra.com

Obtenir l'utilisateur actuel, au sein d'une action ApiController, sans transmettre l'ID utilisateur en tant que paramètre

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.

87
Shaun Luttin

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

135
Darrel Miller

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();
35
Patrick

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

14
Karan Bhandari

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).

6
kannankeril

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;
5
Jeff Leach

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

4
Venkatesh Muniyandi

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. :)

3
pampi
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

1
Shaun Luttin