web-dev-qa-db-fra.com

Obtenir l'ID utilisateur de l'utilisateur connecté dans Asp.Net MVC 5

Je suis relativement nouveau dans ASP.Net MVC et essayez maintenant d’utiliser la fonctionnalité de connexion utilisateur intégrée. Je peux enregistrer un utilisateur dans la vue d'inscription. Si j'essaie de me connecter avec l'utilisateur créé, cela fonctionne également. Je suis redirigé vers la page maître.

Mais je ne peux pas obtenir l'ID utilisateur de l'utilisateur actuel. J'ai essayé mon code dans HomeController et dans AccountController, mais les deux n'ont pas fonctionné. L'instruction dans la première ligne retourne toujours null.

var userID = User.Identity.GetUserId();

if (!string.IsNullOrEmpty(userID))
{
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(ApplicationDbContext.Create()));
    var currentUser = manager.FindById(User.Identity.GetUserId());
}

Dois-je faire autre chose avant d'obtenir l'ID utilisateur?

40
Philipp Eger

La réponse est juste là dans votre code. Qu'est-ce que ce retour?

var userID = User.Identity.GetUserId();

Si vous utilisez ASP.NET Identity, alors après connexion (et redirection vers une autre page), le IPrincipal.IIdentity devrait être un ClaimsIdentity. Vous pouvez essayer ceci:

var claimsIdentity = User.Identity as ClaimsIdentity;
if (claimsIdentity != null)
{
    // the principal identity is a claims identity.
    // now we need to find the NameIdentifier claim
    var userIdClaim = claimsIdentity.Claims
        .FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);

    if (userIdClaim != null)
    {
        var userIdValue = userIdClaim.Value;
    }
}

Le bloc de code ci-dessus n'est pas exactement, mais essentiellement, ce que le IIdentity.GetUserId méthode d'extension fait.

Si rien de tout cela ne fonctionne, il est possible que l'utilisateur ne soit pas encore connecté à votre site. Une fois connecté, vous devez rediriger vers une autre page avant que le serveur n’écrive le cookie d’authentification sur le navigateur. Ce cookie doit être écrit avant le User.Identity possède toutes ces informations de réclamation (y compris le NameIdentifier) lors de demandes ultérieures .

54
danludwig