tag route net for data asp all asp.net asp.net-identity asp.net-core-mvc asp.net-core-1.0

asp.net - route - select asp-for asp-items



Cómo obtener el ID de usuario conectado actualmente en ASP.NET Core (13)

Actualización en ASP.NET Core Version> = 2.0

En el controlador:

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 } }

En alguna otra clase:

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); } }

Entonces debe registrar IHttpContextAccessor en la clase de Startup la siguiente manera:

public void ConfigureServices(IServiceCollection services) { services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); // Or you can also register as follows services.AddHttpContextAccessor(); }

Para mayor legibilidad, escriba los métodos de extensión de la siguiente manera:

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

Luego use de la siguiente manera:

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

He hecho esto antes con MVC5 usando User.Identity.GetUserId() pero eso no parece funcionar aquí. User.Identity no tiene el método GetUserId()

Estoy usando Microsoft.AspNet.Identity


Aunque la respuesta de Adrien es correcta, puede hacer todo esto en una sola línea. No hay necesidad de funciones adicionales o desorden.

Funciona, lo comprobé en ASP.NET Core 1.0

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

entonces puede obtener otras propiedades de la variable como user.Email . Espero que esto ayude a alguien.


Como se indicó en alguna parte de esta publicación, el método GetUserId () se ha movido al UserManager.

[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, }); }

Si comenzó un proyecto vacío, es posible que deba agregar el UserManger a sus servicios en startup.cs. De lo contrario, este ya debería ser el caso.


Hasta ASP.NET Core 1.0 RC1 :

Es User.GetUserId () del espacio de nombres System.Security.Claims .

Desde ASP.NET Core 1.0 RC2 :

Ahora tiene que usar UserManager . Puede crear un método para obtener el usuario actual:

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

Y obtenga información del usuario con el objeto:

var user = await GetCurrentUserAsync(); var userId = user?.Id; string mail = user?.Email;

Nota: Puede hacerlo sin usar un método para escribir líneas individuales como esta string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email , pero no respeta el principio de responsabilidad única. Es mejor aislar la forma en que obtiene al usuario porque si algún día decide cambiar su sistema de administración de usuarios, como usar otra solución que no sea Identity, le resultará doloroso ya que tiene que revisar todo el código.


Incluí el uso de System.Security.Claims y pude acceder al método de extensión GetUserId ()

NB: ya tenía Microsoft.AspNet.Identity usando pero no pude obtener el método de extensión. Así que supongo que ambos deben usarse en conjunto

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

EDITAR : Esta respuesta ahora está desactualizada. Mire la respuesta de Soren o Adrien para obtener una forma anticuada de lograr esto en CORE 1.0



Si desea esto en ASP.NET MVC Controller, use

using Microsoft.AspNet.Identity; User.Identity.GetUserId();

GetUserId() agregar una declaración de using porque GetUserId() no estará allí sin ella.


Solo para .NET Core 2.0 Se requiere lo siguiente para obtener el ID de usuario del usuario conectado en una clase de Controller :

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

o

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); }

p.ej

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


User.Identity.GetUserId ();

no existe en asp.net identity core 2.0. En este sentido, me las he arreglado de otra manera. He creado una clase común para usar toda la aplicación, debido a la obtención de información del usuario.

crear una clase común PCommon e interfaz IPCommon agregando referencias using System.Security.Claims

_iPCommon.GetUserId();

Aquí la implementación de la clase común

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

obtener userId y name en la acción de inserción

using Microsoft.AspNet.Identity; User.Identity.GetUserId();

Gracias Maksud


debes importar Microsoft.AspNetCore.Identity & 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(); } }


en el APiController

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)); } } }

Algo como esto obtendrás los reclamos


uso puede usar

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

por alguna razón, NameIdentifier ahora recupera el nombre de usuario (.net core 2.2)


puedes obtenerlo en tu controlador:

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

o escriba un método de extensión como antes .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; } } }

y llegar a donde esté disponible el usuario ClaimsPrincipal :

using Microsoft.AspNetCore.Mvc; using Shared.Web.MvcExtensions; namespace Web.Site.Controllers { public class HomeController : Controller { public IActionResult Index() { return Content(this.User.GetUserId()); } } }