usuario obtener net mvc logueado como codigo autenticacion asp c# asp.net-core asp.net-core-mvc asp.net-identity

net - obtener usuario de windows c#



ASP.NET Core Identity: obtenga el usuario actual (6)

Asumiendo que su código está dentro de un controlador MVC:

public class MyController : Microsoft.AspNetCore.Mvc.Controller

Desde la clase base Controller , puede obtener IClaimsPrincipal desde la propiedad User

System.Security.Claims.ClaimsPrincipal currentUser = this.User;

Puede verificar los reclamos directamente (sin un viaje de ida y vuelta a la base de datos):

bool IsAdmin = currentUser.IsInRole("Admin"); var id = _userManager.GetUserId(User); // Get user id:

Se pueden obtener otros campos de la entidad Usuario de la base de datos:

  1. Obtenga el administrador de usuarios mediante inyección de dependencia

    private UserManager<ApplicationUser> _userManager; //class constructor public MyController(UserManager<ApplicationUser> userManager) { _userManager = userManager; }

  2. Y úsalo:

    var user = await _userManager.GetUserAsync(User); var email = user.Email;

Para obtener el usuario actualmente conectado en MVC5, todo lo que teníamos que hacer era:

using Microsoft.AspNet.Identity; [Authorize] public IHttpActionResult DoSomething() { string currentUserId = User.Identity.GetUserId(); }

Ahora, con ASP.NET Core pensé que esto debería funcionar, pero arroja un error.

using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Http; private readonly UserManager<ApplicationUser> _userManager; [HttpPost] [Authorize] public async Task<IActionResult> StartSession() { var curUser = await _userManager.GetUserAsync(HttpContext.User); }

¿Algunas ideas?

EDITAR: la respuesta de Gerardo está en camino, pero para obtener el "Id" real del usuario, esto parece funcionar:

ClaimsPrincipal currentUser = this.User; var currentUserID = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value;


En .NET Core 2.0, el usuario ya existe como parte del controlador heredado subyacente. Simplemente use el Usuario como lo haría normalmente o pase a cualquier código de repositorio.

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme, Policy = "TENANT")] [HttpGet("issue-type-selection"), Produces("application/json")] public async Task<IActionResult> IssueTypeSelection() { try { return new ObjectResult(await _item.IssueTypeSelection(User)); } catch (ExceptionNotFound) { Response.StatusCode = (int)HttpStatusCode.BadRequest; return Json(new { error = "invalid_grant", error_description = "Item Not Found" }); } }

Aquí es de donde lo hereda

#region Assembly Microsoft.AspNetCore.Mvc.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60 // C:/Users/BhailDa/.nuget/packages/microsoft.aspnetcore.mvc.core/2.0.0/lib/netstandard2.0/Microsoft.AspNetCore.Mvc.Core.dll #endregion using System; using System.IO; using System.Linq.Expressions; using System.Runtime.CompilerServices; using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.AspNetCore.Routing; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNetCore.Mvc { // // Summary: // A base class for an MVC controller without view support. [Controller] public abstract class ControllerBase { protected ControllerBase(); // // Summary: // Gets the System.Security.Claims.ClaimsPrincipal for user associated with the // executing action. public ClaimsPrincipal User { get; }


He puesto algo como esto en mi clase de controlador y funcionó:

IdentityUser user = await userManager.FindByNameAsync(HttpContext.User.Identity.Name);

donde userManager es una instancia de la clase Microsoft.AspNetCore.Identity.UserManager (con toda la configuración extraña que la acompaña).


Para el contexto, creé un proyecto usando la plantilla de aplicación web ASP.NET Core 2. Luego, seleccione la Aplicación web (MVC), luego presione el botón Cambiar autenticación y seleccione Cuentas de usuario individuales.

Se ha creado una gran cantidad de infraestructura para usted a partir de esta plantilla. Encuentra ManageController en la carpeta Controllers.

Este constructor de clase ManageController requiere que esta variable UserManager se complete:

private readonly UserManager<ApplicationUser> _userManager;

Luego, eche un vistazo al método de índice [HttpPost] en esta clase. Consiguen el usuario actual de esta manera:

var user = await _userManager.GetUserAsync(User);

Como nota adicional, aquí es donde desea actualizar los campos personalizados al perfil de usuario que ha agregado a la tabla AspNetUsers. Agregue los campos a la vista, luego envíe esos valores al IndexViewModel que luego se envía a este método Post. Agregué este código después de la lógica predeterminada para configurar la dirección de correo electrónico y el número de teléfono:

user.FirstName = model.FirstName; user.LastName = model.LastName; user.Address1 = model.Address1; user.Address2 = model.Address2; user.City = model.City; user.State = model.State; user.Zip = model.Zip; user.Company = model.Company; user.Country = model.Country; user.SetDisplayName(); user.SetProfileID(); _dbContext.Attach(user).State = EntityState.Modified; _dbContext.SaveChanges();


Si está utilizando Bearing Token Auth, las muestras anteriores no devuelven un usuario de la aplicación.

En cambio, use esto:

ClaimsPrincipal currentUser = this.User; var currentUserName = currentUser.FindFirst(ClaimTypes.NameIdentifier).Value; ApplicationUser user = await _userManager.FindByNameAsync(currentUserName);

Esto funciona en apsnetcore 2.0. No lo he probado en versiones anteriores.


Solo si alguien está interesado, esto funcionó para mí. Tengo una identidad personalizada que usa int para una clave primaria, así que anulé el método GetUserAsync

Anular GetUserAsync

public override Task<User> GetUserAsync(ClaimsPrincipal principal) { var userId = GetUserId(principal); return FindByNameAsync(userId); }

Obtener usuario de identidad

var user = await _userManager.GetUserAsync(User);

Si está utilizando una clave primaria Guid normal, no necesita anular GetUserAsync. Todo esto supone que su token está configurado correctamente.

public async Task<string> GenerateTokenAsync(string email) { var user = await _userManager.FindByEmailAsync(email); var tokenHandler = new JwtSecurityTokenHandler(); var key = Encoding.ASCII.GetBytes(_tokenProviderOptions.SecretKey); var userRoles = await _userManager.GetRolesAsync(user); var roles = userRoles.Select(o => new Claim(ClaimTypes.Role, o)); var claims = new[] { new Claim(JwtRegisteredClaimNames.Sub, user.UserName), new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()), new Claim(JwtRegisteredClaimNames.Iat, DateTime.UtcNow.ToString(CultureInfo.CurrentCulture)), new Claim(JwtRegisteredClaimNames.GivenName, user.FirstName), new Claim(JwtRegisteredClaimNames.FamilyName, user.LastName), new Claim(JwtRegisteredClaimNames.Email, user.Email), } .Union(roles); var tokenDescriptor = new SecurityTokenDescriptor { Subject = new ClaimsIdentity(claims), Expires = DateTime.UtcNow.AddHours(_tokenProviderOptions.Expires), SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature) }; var token = tokenHandler.CreateToken(tokenDescriptor); return Task.FromResult(new JwtSecurityTokenHandler().WriteToken(token)).Result; }