Como obter o usuário atual e como usar a classe User no MVC5?

159
  • Como posso obter o ID do usuário atualmente conectado no MVC 5 ? Tentei as sugestões do StackOverflow, mas elas parecem não ser para o MVC 5.
  • Além disso, qual é a melhor prática do MVC 5 de atribuir itens aos usuários? (por exemplo, um Userdeveria ter Items. Devo armazenar o usuário Idem Item? Posso estender a Userclasse com uma List<Item>propriedade de navegação?

Estou usando "Contas de usuário individuais" do modelo MVC.

Tentei estes:

'Membership.GetUser ()' é nulo.

Adam Szabo
fonte
Adicionadas as referências do que eu tentei. O último estava OK no MVC4, mas não no MVC5. Também eu preciso de algumas das melhores práticas de "usar User" :)
Adam Szabo
Quando você diz que está usando o MVC 5, o que está usando para ser membro? OWin.Security?
Aron
"Contas de usuário individuais" do modelo MVC.
Adam Szabo 26/08
3
HttpContext.Current.User.Identity.Nameé o nome do usuário atualmente conectado.
usar o seguinte código
1
Como obter o ID ? Eu gostaria de atribuir o usuário atual ao que Itemele cria, mas não com base no nome de usuário (isso pode mudar). Ele não está funcionando da maneira que 'HttpContext.Current' System.Web.HttpContextBase 'não contém uma definição para' Current 'e nenhum método de extensão' Current 'aceitando um primeiro argumento do tipo' System.Web.HttpContextBase 'pode ser encontrado ( está faltando uma diretiva de uso ou uma referência de montagem?) `. Tem certeza de que sua solução é para o MVC 5?
Adam Szabo 26/08

Respostas:

313

Se você estiver codificando em um controlador ASP.NET MVC, use

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Vale mencionar isso User.Identity.IsAuthenticatede User.Identity.Namefuncionará sem adicionar a usingdeclaração acima mencionada . Mas GetUserId()não estará presente sem ele.

Se você estiver em uma classe que não seja um Controller, use

HttpContext.Current.User.Identity.GetUserId();

No modelo padrão do MVC 5, o ID do usuário é um GUID armazenado como uma sequência.

Nenhuma prática recomendada ainda, mas encontrei algumas informações valiosas sobre a extensão do perfil do usuário:

Adam Szabo
fonte
9
A autenticação e a autorização do usuário foram alteradas para o ASP.NET MVC 5. Agora, é uma autenticação baseada em declarações com interfaces e repositórios genéricos que você pode usar com a EF ou outro provedor (a implementação da EF é o padrão). Como GetUserIdé um método de extensão armazenado na parte inferior de Ass_Start\IdentityConfig.cs, onde você precisar usá-lo, se estiver em um espaço para nome diferente, será necessário definir o using Microsoft.AspNet.Identitypara que a extensão fique visível.
Anderson Matos
1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy
Se eu adicionar a referência de uso, o usuário ainda está sublinhado em vermelho? Por que isso seria?
Zapnologica 31/01
@ Zapnologica: tente reconstruir o projeto, talvez o VS IntelliSense esteja um pouco lento.
Adam Szabo 31/01
5
OBSERVAÇÃO O usuário está disponível apenas em um controlador msdn.microsoft.com/en-us/library/… (@Zapnologica você o está usando fora de um controlador? Tente HttpContext.Current.User.Identity.GetUserId ();)
entre
28

Tente algo como:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

Funciona com RTM.

Rok Bermež
fonte
11
Impõe uma viagem desnecessária ao banco de dados.
Arash
3
@Rash, como o aplicativo deve obter o objeto do usuário sem entrar em contato com o banco de dados?
fabspro
2
@ Arash não importa, eu entendo o que você quer dizer. O ID pode ser recuperado com User.Identity.GetUserId (); sem nenhuma viagem ao banco de dados.
fabspro
Lembre-se com mvc5 (associação 2): User.Identity.GetUserId () é diferente com o id na tabela [AspNetUsers]. Então Jakub Arnold e Rok é a maneira correta
lobo cinzento
Estou um pouco confuso com a resposta. Estou recebendo um tipo de UserStore não parece existir no meu contexto de controlador. Alguma ideia?
Jhourlad Estrella
19

Se você desejar o objeto ApplicationUser em uma linha de código (se você tiver a última identidade do ASP.NET instalada), tente:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Você precisará das seguintes instruções de uso:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
firecape
fonte
Objeto não encontrado para <ApplicationUserManager>
Fandango68
7

Obter o ID é bem simples e você resolveu isso.

Sua segunda pergunta, porém, é um pouco mais envolvida.

Portanto, isso é tudo pré-lançamento agora, mas o problema comum que você enfrenta é o de estender o usuário com novas propriedades (ou uma coleção de itens na sua pergunta).

Pronto, você receberá um arquivo chamado IdentityModelna pasta Modelos (no momento da redação). Lá você tem algumas aulas; ApplicationUsere ApplicationDbContext. Para adicionar sua coleção, Itemsvocê deseja modificar a ApplicationUserclasse, como faria se essa fosse uma classe normal que você estava usando com o Entity Framework. De fato, se você der uma olhada rápida, descobrirá que todas as classes relacionadas à identidade (Usuário, Função etc ...) agora são apenas POCOs com as anotações de dados apropriadas, para que funcionem bem com o EF6.

Em seguida, você precisará fazer algumas alterações no AccountControllerconstrutor para que ele saiba usar seu DbContext.

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Agora, obter todo o objeto de usuário para o usuário conectado é um pouco esotérico para ser honesto.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Essa linha fará o trabalho e você poderá acessar userWithItems.Itemscomo quiser.

HTH

EightyOne Unite
fonte
Suponho que não exista algo como documentos de pré-lançamento, pois tudo isso existe?
Derek Tomes
@ Derek Tomes - Não que eu me deparei. Acho que teremos que esperar até 13 de novembro por documentos reais. Não foi ótimo ser honesto, há até um pedido de melhor orientação no uservoice - aspnet.uservoice.com/forums/41199-general-asp-net/suggestions/…
EightyOne Unite
ok, mas como faço para chegar a uma instância do tipo AccountController?
ninho
0

Sinto sua dor, estou tentando fazer a mesma coisa. No meu caso, eu só quero limpar o usuário.

Eu criei uma classe de controlador base que todos os meus controladores herdam. Nele, substituo OnAuthenticatione defino ofilterContext.HttpContext.User to null

Foi o melhor que consegui até agora ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}
Derek Tomes
fonte
0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;
Hari Lakkakula
fonte
Por favor, não basta postar código, especialmente sem comentários. Se você explicar seu código, seria mais útil.
Ali Kanat 08/02/19
0

se alguém mais tiver essa situação: estou criando uma verificação de e-mail para fazer login no meu aplicativo, para que meus usuários ainda não estejam conectados, no entanto, usei o abaixo para verificar se há um e-mail inserido no login, o que é uma variação da solução @firecape

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

você também precisará do seguinte:

using Microsoft.AspNet.Identity;

e

using Microsoft.AspNet.Identity.Owin;
Duan Walker
fonte
0

No .Net MVC5 core 2.2, eu uso HttpContext.User.Identity.Name. Funcionou para mim.

Bhupinder Yadav
fonte
0

Foi assim que consegui um AspNetUser Id e o exibi na minha home page

Coloquei o seguinte código no meu método HomeController Index ()

ViewBag.userId = User.Identity.GetUserId();

Na página de visualização, basta ligar

ViewBag.userId 

Execute o projeto e você poderá ver seu userId

Kelvin Nyadzayo
fonte