web-dev-qa-db-fra.com

Comment obtenir l'ID utilisateur actuellement connecté dans ASP.NET Core

J'ai déjà fait cela avec MVC5 en utilisant User.Identity.GetUserId() mais cela ne semble pas fonctionner ici . Le User.Identity n'a pas la méthode GetUserId()

J'utilise Microsoft.AspNet.Identity

95
MRainzo

J'ai inclus à l'aide de System.Security.Claims et j'ai pu accéder à la méthode d'extension GetUserId ()

NB: J'avais déjà utilisé Microsoft.AspNet.Identity mais je n'ai pas pu obtenir la méthode d'extension. Donc, je suppose que les deux doivent être utilisés en conjonction

using Microsoft.AspNet.Identity;
using System.Security.Claims;

EDIT: Cette réponse est maintenant obsolète. Examinez la réponse de Soren ou Adrien pour une méthode dépassée dans CORE 1.0.

34
MRainzo

Jusqu'à ASP.NET Core 1.0 RC1 :

Il s'agit de User.GetUserId () de l'espace de noms System.Security.Claims.

Depuis ASP.NET Core 1.0 RC2 :

Vous devez maintenant utiliser UserManager . Vous pouvez créer une méthode pour obtenir l'utilisateur actuel:

private Task<ApplicationUser> GetCurrentUserAsync() => _userManager.GetUserAsync(HttpContext.User);

Et obtenez les informations utilisateur avec l'objet:

var user = await GetCurrentUserAsync();

var userId = user?.Id;
string mail = user?.Email;

Remarque: Vous pouvez le faire sans utiliser une méthode d'écriture de lignes simples comme celle-ci string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email, mais elle ne respecte pas le principe de responsabilité unique. Il est préférable d'isoler la manière dont vous obtenez l'utilisateur, car si vous décidiez un jour de modifier votre système de gestion des utilisateurs, comme si vous utilisiez une autre solution qu'Identity, la tâche deviendrait pénible, car vous devez revoir l'ensemble de votre code.

87
AdrienTorris

vous pouvez l'obtenir dans votre contrôleur:

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

ou écrit une méthode d’extension identique à celle d’avant .Core v1.0

using System;
using System.Security.Claims;

namespace Shared.Web.MvcExtensions
{
    public static class ClaimsPrincipalExtensions
    {
        public static string GetUserId(this ClaimsPrincipal principal)
        {
            if (principal == null)
                throw new ArgumentNullException(nameof(principal));

            return principal.FindFirst(ClaimTypes.NameIdentifier)?.Value;
        }
    }
}

et obtenir partout où l'utilisateur ClaimsPrincipal est disponible

using Microsoft.AspNetCore.Mvc;
using Shared.Web.MvcExtensions;

namespace Web.Site.Controllers
{
    public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return Content(this.User.GetUserId());
        }
    }
}
61
Soren

Mise à jour dans ASP.NET Core 2.1 et 2.2:

Dans le contrôleur:

public class YourControllerNameController : Controller
{
    public IActionResult YourMethodName()
    {
        var userId =  User.FindFirst(ClaimTypes.NameIdentifier).Value // will give the user's userId
        var userName =  User.FindFirst(ClaimTypes.Name).Value // will give the user's userName
        var userEmail =  User.FindFirst(ClaimTypes.Email).Value // will give the user's Email
    }
}

Dans une autre classe:

public class OtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    public OtherClass(IHttpContextAccessor httpContextAccessor)
    {
       _httpContextAccessor = httpContextAccessor;
    }

   public void YourMethodName()
   {
      var userId = _httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
      // or
      var userId = _httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);
   }
}

Ensuite, vous devriez inscrire IHttpContextAccessor dans la classe Startup comme suit:

public void ConfigureServices(IServiceCollection services)
{
    services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

    // Or you can also register as follows

    services.AddHttpContextAccessor();
}
30
TanvirArjel

Pour .NET Core 2.0 uniquement Les opérations suivantes sont requises pour extraire l'identifiant de l'utilisateur connecté dans une classe Controller:

var userId = this.User.FindFirstValue(ClaimTypes.NameIdentifier);

ou

var userId = HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier);

par exemple.

contact.OwnerID = this.User.FindFirstValue(ClaimTypes.NameIdentifier);
20
Oracular Man

Comme indiqué quelque part dans ce post, la méthode GetUserId () a été déplacée vers UserManager.

private readonly UserManager<ApplicationUser> _userManager;

public YourController(UserManager<ApplicationUser> userManager)
{
    _userManager = userManager;
}

public IActionResult MyAction()
{
    var userId = _userManager.GetUserId(HttpContext.User);

    var model = GetSomeModelByUserId(userId);

    return View(model);
}

Si vous avez démarré un projet vide, vous devrez peut-être ajouter le Gestionnaire d’utilisateur à vos services dans startup.cs. Sinon, cela devrait déjà être le cas.

12
Menno Guldemond

Bien que la réponse d'Adrien soit correcte, vous pouvez le faire en une seule ligne. Pas besoin de fonction supplémentaire ou de gâchis.

Cela fonctionne je l'ai vérifié dans ASP.NET Core 1.0

var user = await _userManager.GetUserAsync(HttpContext.User);

alors vous pouvez obtenir d'autres propriétés de la variable comme user.Email. J'espère que ça aidera quelqu'un.

5
Ahmad

Pour ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):

La Id a été changée en User.Identity.Name

    [Authorize, HttpGet("Profile")]
    public async Task<IActionResult> GetProfile()
    {
        var user = await _userManager.FindByIdAsync(User.Identity.Name);

        return Json(new
        {
            IsAuthenticated = User.Identity.IsAuthenticated,
            Id = User.Identity.Name,
            Name = $"{user.FirstName} {user.LastName}",
            Type = User.Identity.AuthenticationType,
        });
    }

Réponse:

 enter image description here

5
jv_

vous devez importer Microsoft.AspNetCore.Identity & System.Security.Claims

// to get current user ID
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);

// to get current user info
var user = await _userManager.FindByIdAsync(userId);
3
Mansur Haider

dans la APiController

User.FindFirst(ClaimTypes.NameIdentifier).Value

Quelque chose comme ça, vous aurez les revendications

2
Usman

User.Identity.GetUserId ();

n'existe pas dans le noyau d'identité de asp.net 2.0. à cet égard, j'ai réussi de manière différente. J'ai créé une classe commune pour utiliser toute l'application, en raison de l'obtention d'informations utilisateur.

crée une classe commune PCommon & interface IPCommon ajout de la référence using System.Security.Claims

using Microsoft.AspNetCore.Http;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;

namespace Common.Web.Helper
{
    public class PCommon: IPCommon
    {
        private readonly IHttpContextAccessor _context;
        public PayraCommon(IHttpContextAccessor context)
        {
            _context = context;
        }
        public int GetUserId()
        {
            return Convert.ToInt16(_context.HttpContext.User.FindFirstValue(ClaimTypes.NameIdentifier));
        }
        public string GetUserName()
        {
            return _context.HttpContext.User.Identity.Name;
        }

    }
    public interface IPCommon
    {
        int GetUserId();
        string GetUserName();        
    }    
}

Ici l'implémentation de la classe commune

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using Pay.DataManager.Concreate;
using Pay.DataManager.Helper;
using Pay.DataManager.Models;
using Pay.Web.Helper;
using Pay.Web.Models.GeneralViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace Pay.Controllers
{

    [Authorize]
    public class BankController : Controller
    {

        private readonly IUnitOfWork _unitOfWork;
        private readonly ILogger _logger;
        private readonly IPCommon _iPCommon;


        public BankController(IUnitOfWork unitOfWork, IPCommon IPCommon, ILogger logger = null)
        {
            _unitOfWork = unitOfWork;
            _iPCommon = IPCommon;
            if (logger != null) { _logger = logger; }
        }


        public ActionResult Create()
        {
            BankViewModel _bank = new BankViewModel();
            CountryLoad(_bank);
            return View();
        }

        [HttpPost, ActionName("Create")]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Insert(BankViewModel bankVM)
        {

            if (!ModelState.IsValid)
            {
                CountryLoad(bankVM);
                //TempData["show-message"] = Notification.Show(CommonMessage.RequiredFieldError("bank"), "Warning", type: ToastType.Warning);
                return View(bankVM);
            }


            try
            {
                bankVM.EntryBy = _iPCommon.GetUserId();
                var userName = _iPCommon.GetUserName()();
                //_unitOfWork.BankRepo.Add(ModelAdapter.ModelMap(new Bank(), bankVM));
                //_unitOfWork.Save();
               // TempData["show-message"] = Notification.Show(CommonMessage.SaveMessage(), "Success", type: ToastType.Success);
            }
            catch (Exception ex)
            {
               // TempData["show-message"] = Notification.Show(CommonMessage.SaveErrorMessage("bank"), "Error", type: ToastType.Error);
            }
            return RedirectToAction(nameof(Index));
        }



    }
}

obtenir l'ID utilisateur et le nom dans l'action d'insertion

_iPCommon.GetUserId();

Merci, Maksud

1
Maksud

utiliser peut utiliser 

string userid = User.FindFirst("id").Value;

pour une raison quelconque, NameIdentifier récupère maintenant le nom d'utilisateur (.net core 2.2)

0
Mosta