He hecho esto antes con MVC5 utilizando User.Identity.GetUserId() pero que no parece funcionar aquí.
El User.Identity no tiene la GetUserId() método

Estoy usando Microsoft.AspNet.Identity

  • pruebe este System.Web.HttpContext.Current.User.Identity.Name?
  • Gracias @PravinDeshmukh pero que devuelve el nombre del usuario y no el id
  • Se debe trabajar. Ver las muestras en asp.net github.com/aspnet/Identity/blob/…. Sólo asegúrese de que el usuario inicia la sesión. @PravinDeshmukh, nunca use el Sistema.Web.HttpContext.Actual en vnext 🙂
  • Hola @user960567, puede usted por favor decirnos por qué ?
  • porque no va a trabajar .NET core y no existe ningún Sistema.Web de la dependencia.
  • Me mostró el código que he usado, que habitualmente trabaja (el Usuario.De la identidad.GetUSerId()) y declaró que el método de extensión GetUserId() no existe, incluso cuando yo estoy usando el de Microsoft.AspNet.De la identidad. No sé qué más podría decir. De todos modos, me di cuenta que necesitaba para incluir también «uso del Sistema.De seguridad.Reclamaciones» para obtener el método de extensión(por ahora, al menos en vNext)

InformationsquelleAutor MRainzo | 2015-06-08

13 Comentarios

  1. 96

    Hasta ASP.NET Core 1.0 RC1 :

    Es el Usuario.GetUserId() de Sistema.De seguridad.Reclamaciones espacio de nombres.

    Desde ASP.NET Core 1.0 RC2 :

    Ahora tiene el uso de UserManager.
    Usted puede crear un método para obtener el usuario actual :

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

    Y obtener información de los usuarios con el objeto de :

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

    Nota :
    Se puede hacer sin el uso de un método de escritura único líneas, de esta string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email, pero no respeta el principio de responsabilidad único. Es mejor aislar la manera de conseguir que el usuario, porque si algún día decide cambiar su sistema de gestión de usuarios, como usar otra solución que la Identidad, va a ser dolorosa, ya que hay que revisar todo el código.

    • Tengo el Sistema.De seguridad.Reclamaciones de espacio de nombres y el de Microsoft.AspNet.La identidad de la asamblea.
    • Creo que esta respuesta es mejor que la aceptó responder especialmente desde asp.net core es la promoción de la inyección de dependencia.
    • Parece equivocado el camino porque userManager hará una petición a la base de datos para recuperar información sobre el usuario. Y en este caso el nombre de usuario ya estaba disponible en HttpContext.Usuario
    • El identificador fue sólo un ejemplo, pero usted puede conseguir toda la información que necesita con el objeto de usuario
    • pero la cuestión era cómo obtener el Id de Usuario. Sólo quería decir que siempre camino no es el más eficiente. Para este caso yo preferiría respuesta por Soren o la versión más corta que se puede encontrar en los comentarios.
  2. 73

    usted puede conseguir en el controlador:

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

    o escribir 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 dónde usuario 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());
            }
        }
    }
    • La primera opción funciona para mí .Core v1.0.0
    • Versión corta: var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    • buen punto 😉
    • Tenga en cuenta que esta extensión método sólo funciona para el Usuario dentro de los controladores, no de ver los componentes, como el punto de vista del Usuario de los componentes es de IPrincipal
    • Esto funciona bien para la cadena de id de usuario, no int.
  3. 67

    Actualización en ASP.NET Core 2.1 y 2.2:

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

    A continuación, usted debe registrar IHttpContextAccessor en el Startup clase como sigue:

    public void ConfigureServices(IServiceCollection services)
    {
        services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    
        //Or you can also register as follows
    
        services.AddHttpContextAccessor();
    }
    • Pero el Usuario está devolviendo null en mi caso? Donde estoy haciendo mal?
    • ¿Estás seguro de que has iniciado sesión con un usuario?
    • Mi escenario es como yo quiero que el nombre de usuario del usuario que ha iniciado sesión en mi sistema. Vamos a ser Ubuntu o Windows? Y como yo estoy probando esto en windows estoy conectado en mi namee. Pero volviendo null.
    • Entonces tienes que ver tu código! Puede ser de cualquier agente externo juega un papel aquí.
    • He encontrado que si usted ha obtenido un resultado nulo de User.Identity.Name, podría ser debido a que la Autenticación Anónima está habilitada. Yo era capaz de conseguir User.Identity.Name de regresar a mi dominio y nombre de usuario mediante la expansión de Properties > launchSettings.json, y el establecimiento de anonymousAuthentication a false, y windowsAuthentication a true.
    • Este es devolver el nombre del usuario para que no me de Identificación. Puede ser debido a algo personalizado estoy haciendo pero esto funcionó lugar para mí: el Usuario.FindFirst(«id»)

  4. 36

    Me incluida la utilización de un Sistema.De seguridad.Reclamaciones y pude acceder a la GetUserId() método de extensión

    PD: he tenido el uso de Microsoft.AspNet.Identidad, pero ya no podía obtener el método de extensión. Así que supongo que ambos han de ser utilizados en relación el uno con el otro

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

    EDITAR:
    Esta respuesta está desactualizado. Mira Soren o Adrien de la respuesta para una fecha de forma de lograr esto en el NÚCLEO de 1.0

    • Este era el secreto de la salsa, pero para cualquiera que lookign después de agregar estas usando es… var userId = User.GetUserId();
    • el .GetUserId() Extensión de ClaimsPrincipal (Controlador.Usuario) ha sido mover a => UserManager.GetUserId(Usuario);
    • el uso del Sistema.De seguridad.Reclamaciones; var userId = este.Usuario.FindFirst(ClaimTypes.NameIdentifier);
    • Pulgares arriba para anterioridad respuesta válida, y la correcta identificación de nueva respuesta «correcta».
  5. 23

    Para .NET Core 2.0 Sólo se requiere lo siguiente para recuperar el id de usuario del Usuario que ha iniciado sesión en un Controller clase:

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

    o

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

    por ejemplo,

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

    Como se dijo en algún lugar en este post, el GetUserId() método ha sido trasladado a la 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 usted comenzó un proyecto vacío puede ser necesario añadir la UserManger a sus servicios en el inicio.cs. De lo contrario, esto ya debería ser el caso.

  7. 5

    Aunque Adrien la respuesta es correcta, usted puede hacer todo esto en una sola línea. No hay necesidad para la función extra o desastre.

    Funciona lo he comprobado en ASP.NET Core 1.0

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

    a continuación, usted puede obtener otras propiedades de la variable como user.Email. Espero que esto ayude a alguien.

    • La razón por la que estoy usando un método es el respeto a la sola responsabilidad principio. Si no aislar la manera de conseguir que el usuario, va a ser doloroso si algún día decide modificar usuario del sistema de gestión, como la otra solución de la Identidad.
  8. 5

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

    La Id fue cambiado a 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,
            });
        }

    Respuesta:

    Cómo obtener la sesión actual en el Id de usuario en ASP.NET Core

    • Basado en mi examen, this.User.Identity.Name tiende a ser el nombre de usuario, aunque. En mi prueba, el nombre de usuario es un correo electrónico, de ser el usuario inicia la sesión de registro o los registros de inicio de sesión externo (por ejemplo, Facebook, Google). Código siguiente devuelve el id de usuario. Yo utilizo un incremento automático de la clave principal para mi usuario de identidad de la tabla, de ahí el int.Analizar. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
    • FindByIdAsync no funciona como usted está proporcionando un nombre de usuario. Funciona cuando se sustituya por FindByNameAsync.
  9. 4

    se tiene que importar de Microsoft.AspNetCore.Identidad & Sistema.De seguridad.Reclamaciones

    //to get current user ID
    var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
    
    //to get current user info
    var user = await _userManager.FindByIdAsync(userId);
    • de todas estas respuestas el tuyo es el único que funciona con ASP.NET CORE v 2.0. Congratz!
  10. 2

    en el APiController

    User.FindFirst(ClaimTypes.NameIdentifier).Value

    Algo como esto usted recibirá las reclamaciones

  11. 1

    Usuario.De la identidad.GetUserId();

    no existe en asp.net identidad core 2.0. en este sentido, lo he conseguido de una manera diferente. he creado una clase común para el uso de toda la aplicación, debido a la obtención de información de usuario.

    crear una clase común PCommon & interfaz IPCommon
    la adición de referencia 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();        
        }    
    }

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

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

    obtener id de usuario y un nombre en la acción de inserción

    _iPCommon.GetUserId();

    Gracias,
    Maksud

    • Usted no tiene que registrarse IHttpContextAccessor en el Inicio.cs?
    • No REMESQ , yo no se inyecte esta en el inicio, pero trabajando en mi aplicación
  12. 0

    podemos usar

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

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

  13. -9

    Si quieres que este en ASP.NET Controlador MVC, uso

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

    Necesita agregar using declaración porque GetUserId() no van a estar allí sin ella.

    • Sí, he incluido en la pregunta que tengo el «uso de Microsoft.AspNet.Identidad». Me di cuenta de cómo resolverlo, aunque con mi respuesta en el post
    • Por lo que vale es (ahora) User.GetUserId() y no User.Identity.GetUserId()
    • La cuestión era y es abou asp.net NÚCLEO que tiene el espacio de nombres Microsoft.AspNetCore.Identidad; y NO de Microsoft.AspNet.De identidad; Y el uso que el nuevo espacio de nombres NO es GetUserId() método de extensión. ESTA RESPUESTA ES INCORRECTA!
    • Fácil en TODO en mayúsculas. Y aprender acerca de ser buenos en ESO. stackoverflow.blog/2018/04/26/…

Dejar respuesta

Please enter your comment!
Please enter your name here