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.