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
Para ASP.NET Core 2.0, Entity Framework Core 2.0, AspNetCore.Identity 2.0 api ( https://github.com/kkagill/ContosoUniversity-Backend ):
El
Id
se cambió a
User.Identity.Name
User.FindFirst(ClaimTypes.NameIdentifier).Value
Respuesta:
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());
}
}
}