Usuario
Como autenticar a un usuario con su rol en mvc

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.
Todas las respuestas
-
hola
puedes hacerlo eprsonalizado pero para eso deberias implementar una autenticacion custom
Customize the SimpleMembership in ASP.NET MVC 4.0
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
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