none
Pegar Id do usuário logado RRS feed

  • Pergunta

  • Em meu projeto tenho um módulo de login e ao usuário logar, eu consigo pegar o nome dele através do User.Identity.Name. Mas o que acontece é que quero fazer tipo o que acontece aqui no fórum, onde eu clico no meu nome e assim posso editar minhas informações. Mas para que eu consiga fazer isso, eu teria que, na minha aplicação(nela não tenho profile), pegar o Id do usuário que está logado, pois só assim eu conseguiria redirecionar ele pra uma página para editar os dados, ou ver as informações dele em uma página de detalhes, que inclusive, já tenho pronta, mas como não consigo pegar o Id do usuário logado, simplesmente não funciona. Será que alguém poderia me ajudar ? Vou colocar aqui, os códigos que tenho até este momento.

    A action de detalhes:

     public ActionResult Detalhes(long? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                //Usuario usuario = db.Usuarios.Find(id);
                //Usuario usuario = db.Usuarios.Include(o => o.Ocorrencias).AsNoTracking().FirstOrDefault(u => u.UsuarioID == id);
                var usuario = db.Usuarios.Include(o => o.Ocorrencias.Select(a => a.Aluno)).FirstOrDefault(u => u.UsuarioID == id);
    
                if (User.Identity.IsAuthenticated && id != null)
                {
                    var userName = User.Identity.Name;
                    var user = usuario.UsuarioID;
                    ViewBag.Id = user;
    
                   // var usu = db.Usuarios.Where(x => x.Nome == userName && x.UsuarioID == id).FirstOrDefault();
                    var usu = db.Usuarios.Where(x => x.Nome == userName && x.UsuarioID == user).FirstOrDefault();
    
                    if (usu != null)
                        return View(usuario);
                }
    
                if (usuario == null)
                {
                    return HttpNotFound();
                }
                return View(usuario);
            }

    A action de login

    public ActionResult Index(String Login, String Senha)
            {
                //verificando login pelo usuario do banco de dados ...
                Usuario login = db.Usuarios.Where(x => x.Login == Login && x.Senha == Senha).FirstOrDefault();
                if (login != null)
                {
                    FormsAuthentication.SetAuthCookie(login.Nome.ToString(), false);
                    Session.Add(".PermissionCookie", login.Perfil);
                    return RedirectToAction("Index", "Home"); //pagina padrao para todos os usuarios...
                }
                return RedirectToAction("Index");
            }

    Aqui é como to recuperando na view

      <ul class="nav navbar-nav navbar-right">
            <li> 
                <a href="/Usuarios/Detalhes?id=">Olá @User.Identity.Name</a>
            </li>
            <li>@Html.ActionLink("Sair", "Sair", "Autenticacao")</li>
        </ul>
    <!-- O Id não estou conseguindo pegar -->

    quarta-feira, 19 de novembro de 2014 11:58

Respostas

  • Erik, você pode recuperar o ID via session da seguinte maneira:

    string idUsuario= Session["IdUsuario"].ToString();

    Dessa maneira você não irá recuperar o valor via URL (querystring), será via processos internos da aplicação.

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    • Marcado como Resposta Érik Thiago domingo, 23 de novembro de 2014 22:08
    sexta-feira, 21 de novembro de 2014 10:09

Todas as Respostas

  • Vi que você guarda as permissões em sessão. Por que você não guarda seu objeto User também? assim você terá todos os dados do usuário logado e se sua classe User também tiver referencia as permissões, você não irá precisar do "PermissionCookie".

    Outra forma, menos usual, é você colocar o id do usuário no seu formauthentication em vez do login, mas quando você precisar consultar algum dado do usuário logado, terá que sempre fazer uma consulta ao banco.

    ********************************************************

    Sempre lembre de marcar a resposta se ela foi útil.

    quarta-feira, 19 de novembro de 2014 12:49
  • Boas ideias Demetrius. Mas será que teria como colocar um exemplo de código ? Da primeira opção, ou seja, guardar o user junto, e como eu poderia pegar o Id no link ?
    quarta-feira, 19 de novembro de 2014 12:57
  • Cara pelo que eu sei vc pode recuperar o usuário corrente em qualquer momento 

    User.Identity.GetUserId();


    Nome : Romy G. Moura Cargo: Analista Programador

    quarta-feira, 19 de novembro de 2014 13:32
  • Isso na view ou no controller ?
    quarta-feira, 19 de novembro de 2014 13:36
  • Tanto faz cara, caso seja na view basta utilizar as expressões de diretivar do mvc que vc esta utilizando no controller não muda só que utiliza c#.


    Nome : Romy G. Moura Cargo: Analista Programador

    quarta-feira, 19 de novembro de 2014 13:39
  • Mas, essa cláusula:
    User.Identity.GetUserId();
    Eu não estou conseguindo achar na view e nem no controller. Tenho algumas outras e o Identity. Mas essa GetUserId eu não tenho. Essa cláusula é do Membership ?
    • Editado Érik Thiago quinta-feira, 20 de novembro de 2014 11:34
    quinta-feira, 20 de novembro de 2014 11:12
  • Cara qual versão de framework vc esta utilizando?

    Para achar estas classes basta utilizar o namespace (using Microsoft.AspNet.Identity;) tanto no controller quanto na view.

    User.Identity.GetUserId();

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


    Nome : Romy G. Moura Cargo: Analista Programador

    quinta-feira, 20 de novembro de 2014 11:46
  • Aaah ta agora eu entendi. Estou usando a 4.5 com MVC 5.2 e VS2013. Mas na minha forma de autenticação, não estou usando o Identity. Estou usando o Forms e de uma forma bem customizada. Se eu colocar o Identity, não vai dar conflito não ? Eu até queria usar o Identity pra fazer as permissões, mas não consegui achar exemplo de como posso usa-lo dessa forma que estou usando.

    E no controller eu usaria assim solto ? Ou colocaria ele em alguma variável ?

    • Editado Érik Thiago quinta-feira, 20 de novembro de 2014 12:31
    quinta-feira, 20 de novembro de 2014 11:51
  • Cara não tem segredo vc pode utilizar da forma que vc quiser, conflito claro pode dar, mas caso em seu projeto tenha conflitos como nome de classes iguais e tal, basta instanciar objetos de forma explicita ex: instanciar objeto passando todo namespace para o objeto instanciado.

    var obj = System.Data.SqlClient;


    Nome : Romy G. Moura Cargo: Analista Programador

    quinta-feira, 20 de novembro de 2014 23:39
  • Boa noite,

    Como você já está utilizando Session, eu acho recomendável você guardar os dados básicos do usuário em Session...a maioria dos sistemas utilizam dessa forma, porque os dados do usuário são carregados apenas uma vez e depois para gerenciar os dados é só recuperá-los através das sessões.

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    quinta-feira, 20 de novembro de 2014 23:47
  • Bruno, sou iniciante em ASP.NET MVC. Mas o que acontece é que: Colocando o Id manualmente no código acima, eu mesmo vendo os Ids no banco e colocando manualmente, o redirecionamento é feito numa boa, ou seja, funciona. Eu clico e a view de detalhes é aberta mostrando os dados daquele usuário específico identificado no ID. Beleza até ai tudo bem, mas como que eu faço pra conseguir pegar esse Id dinamicamente na session ? Pois a view de detalhes e a de edição são abertas de acordo com o id específico  que vem na url. E como eu posso recuperar esse id, já que não estou usando o AspNet Identity. Estou usando o formsautentication de forma customizada, como está ali em cima no código.
    sexta-feira, 21 de novembro de 2014 01:30
  • Erik, você pode recuperar o ID via session da seguinte maneira:

    string idUsuario= Session["IdUsuario"].ToString();

    Dessa maneira você não irá recuperar o valor via URL (querystring), será via processos internos da aplicação.

    Abs.


    Dicas de programação em .net, C# e SQL - http://smcode.com.br/blog.aspx

    • Marcado como Resposta Érik Thiago domingo, 23 de novembro de 2014 22:08
    sexta-feira, 21 de novembro de 2014 10:09
  • Muito bom cara. Fiz uma lógica aqui que funcionou ! Valeu mesmo !
    • Editado Érik Thiago domingo, 23 de novembro de 2014 22:13
    sexta-feira, 21 de novembro de 2014 11:56