Você não precisa consultar o banco de dados diretamente para o ApplicationUser atual.
Isso introduz uma nova dependência de ter um contexto extra para iniciantes, mas daqui para frente as tabelas do banco de dados do usuário mudam (3 vezes nos últimos 2 anos), mas a API é consistente. Por exemplo, a users
tabela agora é chamada AspNetUsers
no Identity Framework e os nomes de vários campos de chave primária são alterados, de modo que o código em várias respostas não funcionará mais como está .
Outro problema é que o acesso OWIN subjacente ao banco de dados usará um contexto separado, para que alterações de acesso SQL separado possam produzir resultados inválidos (por exemplo, não vendo alterações feitas no banco de dados). Novamente, a solução é trabalhar com a API fornecida e não tentar contorná- la.
A maneira correta de acessar o objeto de usuário atual na identidade do ASP.Net (nesta data) é:
var user = UserManager.FindById(User.Identity.GetUserId());
ou, se você tiver uma ação assíncrona, algo como:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
requer que você tenha a seguinte instrução using para que os UserManager
métodos não assíncronos estejam disponíveis (eles são métodos de extensão para o UserManager, portanto, se você não incluir isso, verá apenas FindByIdAsync
):
using Microsoft.AspNet.Identity;
Se você não estiver em um controlador (por exemplo, você estiver usando injeção IOC), o ID do usuário será recuperado na íntegra de:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Se você não estiver no controlador de conta padrão, precisará adicionar o seguinte (como exemplo) ao seu controlador:
1. Adicione estas duas propriedades:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Adicione isso no construtor do Controlador:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Atualização de março de 2015
Nota: A atualização mais recente da estrutura de identidade altera uma das classes subjacentes usadas para autenticação. Agora você pode acessá-lo no Contexto Owin do atual HttpContent.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Termo aditivo:
Ao usar o EF e o Identity Framework com o Azure, em uma conexão remota com o banco de dados (por exemplo, teste de host local com o banco de dados do Azure), você pode acertar aleatoriamente o temido "erro: 19 - a conexão física não é utilizável". Como a causa está oculta no Identity Framework, onde você não pode adicionar novas tentativas (ou o que parece estar faltando .Include(x->someTable)
), é necessário implementar uma customização SqlAzureExecutionStrategy
no seu projeto.
ApplicationUser
classe (específica do aplicativo) e aAspNetUsers
tabela em paralelo, e elas fornecerão novos campos. Novamente: Não acerte o banco de dados diretamente! :)Meu erro, eu não deveria ter usado um método dentro de uma consulta LINQ.
Código correto:
fonte
UserManager
métodos e não atingir o banco de dados diretamente?Está nos comentários das respostas, mas ninguém postou isso como a solução real.
Você só precisa adicionar uma instrução using na parte superior:
fonte
using
. Vendo como 15k pessoas visitaram a pergunta que eu percebi que era uma resposta útil :).GetUserId()
é um método de extensãoO código de Ellbar funciona! Você só precisa adicionar usando.
1 -
using Microsoft.AspNet.Identity;
E ... o código de Ellbar:
2 -
string currentUserId = User.Identity.GetUserId(); ApplicationUser currentUser = db.Users.FirstOrDefault(x => x.Id == currentUserId);
Com este código (in
currentUser
), você trabalha os dados gerais do usuário conectado, se desejar dados extras ... consulte este linkfonte
ApplicationUser
objetoA partir do ASP.NET Identity 3.0.0, isso foi refatorado para
fonte
fonte
Para o MVC 5, basta olhar dentro do método EnableTwoFactorAuthentication do ManageController no andaime do modelo WebApplication, sendo feito aqui:
A resposta está aí, como sugerido pela própria Microsoft:
Ele terá todas as propriedades adicionais definidas na classe ApplicationUser.
fonte
No momento, o modelo de projeto asp.mvc cria um controlador de conta que obtém o gerenciador de usuários da seguinte maneira:
O seguinte funciona para mim:
fonte
Eu estava disponível com sucesso para obter o Usuário do aplicativo seguindo o código
fonte
No caso de alguém estar trabalhando com
Identity
usuáriosweb forms
, eu consegui:fonte