Como obter o ID do usuário conectado no ASP.NET Core
Eu fiz isso antes com o MVC5 usando, User.Identity.GetUserId()mas isso não parece funcionar aqui. O User.Identitynão tem o GetUserId()método
estou usando Microsoft.AspNet.Identity
asp.net asp.net-identity asp.net-core-mvc asp.net-core-1.0
— MRainzo
tente isso System.Web.HttpContext.Current.User.Identity.Name?
— Pravin Deshmukh
Obrigado @PravinDeshmukh mas que retorna o nome do usuário e não o id #
— MRainzo 8/15
Deveria funcionar. Veja os exemplos em asp.net github.com/aspnet/Identity/blob/… . Apenas verifique se o usuário está logado. @PravinDeshmukh, nunca use System.Web.HttpContext.Current no vnext :)
— user960567
Olá @ user960567, pode nos dizer por que?
@PravinDeshmukh porque não funcionará no núcleo do .NET e não há dependência do System.Web.
Atualização na versão principal do ASP.NET> = 2.0
public YourControllerNameController(UserManager<ApplicationUser> userManager)
public async Task<IActionResult> YourMethodName()
var userId =  User.FindFirstValue(ClaimTypes.NameIdentifier) // will give the user's userId
var userName =  User.FindFirstValue(ClaimTypes.Name) // will give the user's userName
ApplicationUser applicationUser = await _userManager.GetUserAsync(User);
string userEmail = applicationUser?.Email; // will give the user's Email
Em alguma outra classe:
Então você deve se registrar IHttpContextAccessorna Startupclasse da seguinte maneira:
// Or you can also register as follows
Para mais legibilidade, escreva os métodos de extensão da seguinte maneira:
public static T GetLoggedInUserId<T>(this ClaimsPrincipal principal)
var loggedInUserId = principal.FindFirstValue(ClaimTypes.NameIdentifier);
return (T)Convert.ChangeType(loggedInUserId, typeof(T));
else if (typeof(T) == typeof(int) || typeof(T) == typeof(long))
return loggedInUserId != null ? (T)Convert.ChangeType(loggedInUserId, typeof(T)) : (T)Convert.ChangeType(0, typeof(T));
throw new Exception("Invalid type provided");
public static string GetLoggedInUserName(this ClaimsPrincipal principal)
return principal.FindFirstValue(ClaimTypes.Name);
public static string GetLoggedInUserEmail(this ClaimsPrincipal principal)
return principal.FindFirstValue(ClaimTypes.Email);
Em seguida, use o seguinte:
var userId = User.GetLoggedInUserId<string>(); // Specify the type of your UserId;
var userName = User.GetLoggedInUserName();
var userEmail = User.GetLoggedInUserEmail();
var userId = _httpContextAccessor.HttpContext.User.GetLoggedInUserId<string>(); // Specify the type of your UserId;
— TanvirArjel
Mas o usuário está retornando nulo no meu caso? Onde estou fazendo errado?
— Sruthi Varghese
Tem certeza de que está logado com um usuário?
— TanvirArjel 7/01/19
Meu cenário é como eu quero o nome de usuário do usuário logado no meu sistema. Que seja Ubuntu ou Windows? E enquanto estou testando isso no Windows, estou logado com meu nome. Mas está voltando null.
Então tem que ver o seu código! Pode ser qualquer agente externo desempenhando um papel aqui.
Descobri que, se você obteve um resultado nulo User.Identity.Name, pode ser porque a autenticação anônima está ativada. Consegui User.Identity.Nameretornar meu domínio e nome de usuário expandindo Properties > launchSettings.jsone definindo anonymousAuthenticationpara falsee windowsAuthenticationpara true.
Até o ASP.NET Core 1.0 RC1 :
É User.GetUserId () de System.Security.Claims espaço para nome .
Desde o ASP.NET Core 1.0 RC2 :
Agora você precisa usar o UserManager . Você pode criar um método para obter o usuário atual:
E obtenha informações do usuário com o objeto:
Nota: Você pode fazer isso sem usar um método para escrever linhas únicas como essa string mail = (await _userManager.GetUserAsync(HttpContext.User))?.Email, mas não respeita o princípio de responsabilidade única. É melhor isolar a maneira como você obtém o usuário, porque se algum dia você decidir alterar seu sistema de gerenciamento de usuários, como usar outra solução que não seja a Identity, será doloroso, pois você precisará revisar todo o código.
— AdrienTorris
Eu tenho o espaço para nome System.Security.Claims e o assembly Microsoft.AspNet.Identity.
— scottheckel
Eu acho que essa resposta é melhor que a resposta aceita, especialmente porque o núcleo do asp.net está promovendo a injeção de dependência.
— Phillip Davis
Parece errado, porque o userManager fará uma solicitação ao banco de dados para recuperar informações sobre o usuário. E, neste caso, o userId já estava disponível no HttpContext.User
@incognito O identificador foi apenas um exemplo, mas você pode obter todas as informações que você precisa com objeto do usuário
@ Adrien, mas a questão era como obter o ID do usuário. Só queria dizer que a maneira fornecida não é a mais eficiente. Neste caso, eu preferiria a resposta de Soren ou a versão mais curta, que pode ser encontrada nos comentários.
você pode obtê-lo em seu controlador:
ou escreva um método de extensão como antes .Core v1.0
e obtenha onde o usuário ClaimsPrincipal estiver disponível :
Versão mais curta:var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
— CFreitas
Note que este método de extensão só funciona para usuário dentro controladores, não visualizar os componentes, como o componente de vista do usuário é de IPrincipal
— adam3039
@AK você pode usar Convert.ToInt32(User.FindFirstValue(ClaimTypes.NameIdentifier))para obter um número inteiro de UserId
— Hamza Khanzada
@HamzaKhanzada Sim, funciona, mas parece tão longo e feio.
Eu incluí o uso de System.Security.Claims e pude acessar o método de extensão GetUserId ()
NB: Eu já usava o Microsoft.AspNet.Identity, mas não conseguia obter o método de extensão. Então eu acho que os dois têm que ser usados ​​em conjunto
EDIT : Esta resposta está desatualizada. Veja a resposta de Soren ou Adrien para obter uma maneira datada de conseguir isso no CORE 1.0.
Este foi o segredo, mas para qualquer um lookign depois de adicionar estes usings está ... var userId = User.GetUserId();
— Samurai Ken
a extensão .GetUserId () de ClaimsPrincipal (Controller.User) foi movida para => UserManager.GetUserId (User);
using System.Security.Claims; var userId = this.User.FindFirst (ClaimTypes.NameIdentifier);
— Comute
Polegares para cima para uma resposta previamente válida e para identificar corretamente a nova resposta "correta".
— pimbrouwers 5/09/17
Somente para .NET Core 2.0 É necessário o seguinte para buscar o UserID do Usuário conectado em uma Controllerclasse:
— Homem Oracular
Conforme declarado em algum lugar nesta postagem, o método GetUserId () foi movido para o UserManager.
Se você iniciou um projeto vazio, pode ser necessário adicionar o UserManger aos seus serviços em startup.cs. Caso contrário, esse já deve ser o caso.
— Menno Guldemond
você precisa importar Microsoft.AspNetCore.Identity & System.Security.Claims
// to get current user info
— Mansur Haider
de todas essas respostas, a sua é a única que funciona com o ASP.NET CORE v 2.0. Congratz!
— Just Fair
é isso. Qualquer pessoa a partir de .NET Núcleo 2.0 e acima, esta é a sua resposta
— alvinchesaro
Testado no .NET Core 3.1 em uma configuração de API da Web + JWT. Quero o usuário conectado no momento em um controlador base, isso não é eficiente, consultar o usuário do banco de dados para todas as solicitações, etc. Existe alguma maneira de obter o usuário atual sem consultar o banco de dados?
por que o meu volta "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier"para User.FindFirstValue(ClaimTypes.NameIdentifier);?
— puerile 14/06
Embora a resposta de Adrien esteja correta, você pode fazer tudo isso em uma única linha. Não há necessidade de função extra ou bagunça.
Funciona, verifiquei no ASP.NET Core 1.0
então você pode obter outras propriedades da variável como user.Email. Espero que isso ajude alguém.
A razão pela qual estou usando um método é respeitar o princípio de responsabilidade única. Se você não isolar a maneira como obtém o usuário, será doloroso se algum dia você decidir modificar seu sistema de gerenciamento de usuários, como usar outra solução que não seja a Identity.
— AdrianTorris 18/04
Para ASP.NET Core 2.0, Entity Framework Core 2.0, API do AspNetCore.Identity 2.0 ( https://github.com/kkagill/ContosoUniversity-Backend ):
O Idfoi alterado paraUser.Identity.Name
— jv_
Com base no meu teste, ele this.User.Identity.Nametende a ser o nome de usuário. No meu teste, o nome de usuário é um email, seja o login do usuário no registro ou o login externo (por exemplo, Facebook, Google). O código a seguir retorna o userId. Eu uso uma chave primária incrementada automaticamente para minha tabela de usuários de identidade, daí o int.Parse. int userId = int.Parse(this.User.FindFirstValue(ClaimTypes.NameIdentifier));
FindByIdAsyncnão funciona como você está fornecendo um nome de usuário. Funciona quando você o substitui FindByNameAsync.
no APiController
Algo assim, você receberá as reivindicações
User.Identity.GetUserId ();
não existe no asp.net identity core 2.0. a este respeito, eu consegui de maneira diferente. Eu criei uma classe comum para usar todo o aplicativo, devido à obtenção de informações do usuário.
criar uma classe comum PCommon e interface IPCommon adicionando referênciausing System.Security.Claims
Aqui a implementação da classe comum
// TempData["show-message"] = Notification.Show(CommonMessage.SaveMessage(), "Success", type: ToastType.Success);
// TempData["show-message"] = Notification.Show(CommonMessage.SaveErrorMessage("bank"), "Error", type: ToastType.Error);
obter userId e nome na ação de inserção
Obrigado, Maksud
— Maksud
Você precisa registrar o IHttpContextAccessor no Startup.cs?
— REMESQ 18/1018
Sem REMESQ, eu não injetar isso em arranque, mas trabalhando no meu aplicativo
Para obter o ID do usuário atual nas visualizações de navalha, podemos injetar o UserManager na visualização da seguinte maneira:
@inject Microsoft.AspNetCore.Identity.UserManager<ApplicationUser> _userManager
@{ string userId = _userManager.GetUserId(User); }
— HO3EiN
uso pode usar
por alguma razão, NameIdentifier agora recupera o nome de usuário (.net core 2.2)
— Mosta
Como administrador trabalhando no perfil de outras pessoas e você precisa obter o ID do perfil em que está trabalhando, você pode usar um ViewBag para capturar o ID, por exemplo, ViewBag.UserId = userId; enquanto userId é a string Parameter do método em que você está trabalhando.
public async Task<IActionResult> ManageUserRoles(string userId)
ViewBag.ErrorMessage = $"User with Id = {userId} cannot be found";
var model = new List<UserRolesViewModel>();
foreach (var role in roleManager.Roles)
var userRolesViewModel = new UserRolesViewModel
RoleName = role.Name
if (await userManager.IsInRoleAsync(user, role.Name))
userRolesViewModel.IsSelected = true;
userRolesViewModel.IsSelected = false;
model.Add(userRolesViewModel);
— sammy Akinsoju
Se você quiser isso no ASP.NET MVC Controller, use
Você precisa adicionar uma usingdeclaração porque GetUserId()não estará lá sem ela.
Sim, eu incluí na pergunta que eu tenho o "using Microsoft.AspNet.Identity". Eu descobri como resolvê-lo embora com a minha resposta no post
FWIW é (agora) User.GetUserId()e nãoUser.Identity.GetUserId()
A questão era e é abou asp.net CORE, que possui o namespace Microsoft.AspNetCore.Identity; e NÃO Microsoft.AspNet.Identity; E usando esse novo espaço para nome, não existe o método de extensão GetUserId (). ESTA RESPOSTA ESTÁ ERRADA!