none
Como autenticar a un usuario con su rol en mvc RRS feed

  • Pregunta

  • Hola a todos:

    Me presento, me llamó Juan y estoy realizando mi proyecto de título de analista. Estoy realizando un proyecto en mvc5 con Visual Studio 2013 y mi proyecto se trata sobre el control y acceso de un gimnasio, hasta el  momento voy bien, pero tengo un problema que mi proyecto debe autenticar a los usuarios con sus respectivos roles y estos tendran ciertos permisos,la verdad siendo sincero no tengo idea como hacerlo. He leido distinta información, todos hablan sobre el sistema de autenticacion que trae por defecto ASP NET MVC, pero yo debo hacer mi propio sistema de autenticacion personalizado.Si alguien pudiera ayudarme se lo agradeceria.

    Aquí va la informacion para que puedan tener una idea.

    1-Una base de datos que tiene una tabla llamada Usuarios tiene los siguientes campos:Username, Password, Confirmacion_password, Correo, Perfil.

    Mi clase de modelo se llama ClsUsuarios y tiene lo siguiente(lo mas importante escribo)

    using System.Collections.Generic;
    using System.Data.SqlClient;
    using System.Linq;

    namespace Gimnasio_web.Models
    {
        public class ClsUsuarios
        {
            private readonly Conexion conexion = new Conexion();
            public string Username { get; set; }
            public string Password { get; set; }
            public string Confirmacion_Password { get; set; }
            public string Correo { get; set; }
            public string Perfil { get; set; }
            public bool Recordarme { get; set; }
            public ClsUsuarios todos { get; set; }

     public ClsUsuarios Loguear(string Username, string Password)
            {
                var strQuery = string.Format(" SELECT * FROM Usuarios WHERE Username='{0}' and Password='{1}' ", Username, Password);
                var retorno = conexion.ExecutaComandoComRetorno(strQuery);
                return TransformaReaderEmListaDeObjeto(retorno).FirstOrDefault();

            }
            private List<ClsUsuarios> TransformaReaderEmListaDeObjeto(SqlDataReader reader)
            {
                var usuarios = new List<ClsUsuarios>();
                while (reader.Read())
                {
                    var tempObjeto = new ClsUsuarios
                    {
                        Username = reader["Username"].ToString(),
                        Password = reader["Password"].ToString(),
                        Confirmacion_Password = reader["Confirmacion_Password"].ToString(),
                        Correo = reader["Correo"].ToString(),
                        Perfil = reader["Perfil"].ToString()
                    };
                    usuarios.Add(tempObjeto);
                }
                return usuarios;
            }
        }
    }

    Mi controlador UsuariosController y tiene el siguiente metodo para loguear:

    public ActionResult Login(string Username, string Password)
            {
                var usuario = new ClsUsuarios();
                var usuarioLogueado = usuario.Loguear(Username, Password);
                if (usuarioLogueado != null)
                {
                    FormsAuthentication.SetAuthCookie(Username, false);

                    Session["Usuario"] = usuarioLogueado;

                    return RedirectToAction("Index","Home");
                }

                ViewBag.Mensagem = "Usuario/Password invalidos";
                return View();        
            }

    Si ejecuto este codigo me loguea, todo bien, pero necesito que al validarme tambien me guarde los datos del usuario(perfil) para que cada usuario de acuerdo a los permisos que tenga tenga derecho a ciertas acciones o metodos.

    Ej:

            [Authorize(Roles="Administrador")]
            public ActionResult Crear_Usuario()
            {
                return View();
            }

    Por lo que he estado investigando la clave esta en FormsAuthentication.SetAuthCookie para que me guarde el perfil y agregar un rol, pero no se como programarla y la informacion que hay es tanta que me confunde y no se por donde empezar.Por favor si alguien me tendiera la mano se lo agradecería.

    viernes, 8 de noviembre de 2013 19:57

Todas las respuestas

  • hola

    puedes hacerlo eprsonalizado pero para eso deberias implementar una autenticacion custom

    Customize the SimpleMembership in ASP.NET MVC 4.0

    Custom Role Provider for MVC

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    sábado, 9 de noviembre de 2013 14:38
  • Hola perdon por la demora ya que estuve ocupado en otras areas del proyecto y he retomado nuevamente el tema. Miren estuve viendo buscando información y he hecho lo siguiente.

    En mi controlador UsuariosController tengo el siguiente código:

    using Practica.Models;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    using System.Web.Security;

    namespace Practica.Controllers
    {
        public class UsuariosController : Controller
        {
            //
            // GET: /Aquí va el metodo por donde me logeo, aqui todo bien, se crea una cokie
            public ActionResult Index(string Username, string Password)
            {
                var acessoAplicacao = new Usuarios();
                var usuarioLogado = acessoAplicacao.Logar(Username, Password);
                if (usuarioLogado != null)
                   
                {      
                    //autentica ele
                    FormsAuthentication.SetAuthCookie(Username, false);
                    
                    //Cria Variaveis Globais
                    Session["Usuario"] = usuarioLogado;
                    
                    return RedirectToAction("About","Home");
                }

                ViewBag.Mensagem = "Login/Senha invalidos";
                return View();
            }

            public ActionResult Salir()
            {
                FormsAuthentication.SignOut();
                Session["Usuario"] = null;
                return RedirectToAction("Index", "Usuarios");

            }

    //Aquí utilizo la sesion para leer el perfil de la tabla Usuarios

           protected void Application_AuthenticateRequest()
            {
                var usuario = (Usuarios)Session["Usuario"];
                    if (Request.IsAuthenticated == true)
                    {
                       
                        //Creo la cookie y inicializo la informacion de los roles en el contexto de seguridad
                        string userInformation = String.Empty;//where the cookie info will be placed
                        string[] roles;//where the user role will be placed

                        // Creo los roles cookie si todavia no existe para la sesión
                        if ((Request.Cookies["cnstUserRole"] == null) || (Request.Cookies["cnstUserRole"].Value == ""))
                        {
                            if (usuario.Perfil == "Administrador")
                                roles = new string[1] { "Administrador" };//this info will be generally collected from database
                            else if (usuario.Perfil == "Recepcionista")
                                roles = new string[1] { "Recepcionista" };//this info will be generally collected from database                   

                            // Create a string to persist para el rol y el usuario
                            userInformation = roles[0] + ";" + usuario.Username;
                            // Create a cookie authentication ticket.
                            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
                                1,                              // version
                                User.Identity.Name,             // user name
                                DateTime.Now,                   // issue time
                                DateTime.Now.AddHours(1),       // expires every hour
                                false,                          // don't persist cookie
                                userInformation
                                );

                            // Encrypt the ticket
                            String cookieStr = FormsAuthentication.Encrypt(ticket);

                            // Envío la cookie al cliente
                            Response.Cookies["cnstUserRole"].Value = cookieStr;
                            Response.Cookies["cnstUserRole"].Path = "/";
                            Response.Cookies["cnstUserRole"].Expires = DateTime.Now.AddMinutes(1);

                        }//if role cookie not found in local pc
                        else//we are getting the role info from cookie
                        {
                            // Get roles from roles cookie
                            FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt("cookieStr");
                            userInformation = ticket.UserData;

                            //info[0] contains the single role and info[1] contains the user name
                            string[] cookieInfo = userInformation.Split(new char[] { ';' });
                            roles = new string[1] { cookieInfo[0] };
                        }

                        //Aquí me da error ya que Context me dice que no existe en el contexto actual, pero no se que colocar acá
                        Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);

                    }//if (Request.IsAuthenticated == true)
                }
            }

        }

    Como pueden ver este el codigo que vi en foros de ASP NET y lo adapte, el problema es que en Mvc 5 hay cosas que cambiaron de lo que habia anteriormente en Asp Net o es distinto a los Web Forms, si se fijan puse en los comentarios donde me da error.. Si alguien pudiera ayudarme se lo agradeceria o por ultimo si me quiere cobrar por ayudarme a terminar ya que es lo ultimo que me falta practicamente de mi proyecto. Quizas el codigo que he hecho esta malo y lo debo empezar de cero, por eso lo coloco para que me puedan ayudar.

    De antemano muchas gracias.


    Juan Lobos

    jueves, 5 de diciembre de 2013 16:41