Anexsoft | Blog y dictado de cursos de Tecnología

En este encontrarás tutoriales de tecnología como PHP, ASP.NET MVC, Front-End, entre otros y cursos exigentes de modalidad online que te ayudarán a crecer profesionalmente.

Clase para agilizar la autenticación en ASP.NET MVC
Actualizado el 26 Abril, 2016 y leído 8,407 veces
Calificación: 9.71 / 10

Clase para agilizar la autenticación en ASP.NET MVC

Anexsoft

He creado una clase que nos permite guardar a un usuario en sesión de manera práctica.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Configuration;
using System.Web.Security;

namespace Helper
{
    public class SessionHelper
    {
        public static bool ExistUserInSession()
        {
            return HttpContext.Current.User.Identity.IsAuthenticated;
        }
        public static void DestroyUserSession()
        {
            FormsAuthentication.SignOut();
        }
        public static int GetUser()
        {
            int user_id = 0;
            if (HttpContext.Current.User != null && HttpContext.Current.User.Identity is FormsIdentity)
            {
                FormsAuthenticationTicket ticket = ((FormsIdentity)HttpContext.Current.User.Identity).Ticket;
                if (ticket != null)
                {
                    user_id = Convert.ToInt32(ticket.UserData);
                }
            }
            return user_id;
        }
        public static void AddUserToSession(string id)
        {
            bool persist = true;
            var cookie = FormsAuthentication.GetAuthCookie("usuario", persist);

            cookie.Name = FormsAuthentication.FormsCookieName;
            cookie.Expires = DateTime.Now.AddMonths(3);

            var ticket = FormsAuthentication.Decrypt(cookie.Value);
            var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, id);

            cookie.Value = FormsAuthentication.Encrypt(newTicket);
            HttpContext.Current.Response.Cookies.Add(cookie);
        }
    }
}

 

Métodos que implementa

A continuación explico que hace cada método.

  • ExistUserInSession, verifica si el usuario actual se encuentra en sesión o no.

  • DestroyUserSession, elimina la sesión actual del usuario.

  • GetUser, obtiene el ID del usuario actual en sesión.

  • AddUserToSession, guarda el ID de nuestro usuario en sesión.

 

Como implementarlo

Tenemos nuestra lógica para hacer una atentificación, los pasos para implementar mi clase sería la siguiente:

  1. Crea un nuevo proyecto ASP.NET MVC y elige sin autenticación, aparentemente no está funcionando cuando trabajas con la autenticación por default de ASP.NET.

  2. En el webconfig debemos agregar dentro de las etiquetas <system.web></system.web>:

    <authentication mode="Forms">
     <forms name="prueba" cookieless="UseCookies" protection="All" />
    </authentication>
  3. Realiza tu algoritmo para auntentificarte.

  4. Si el usuario ha pasado la validación, guarda su ID con el método AddUserToSession

    SessionHelper.AddUserToSession(id.ToString());
  5. Listo, ya tenemos al usuario en sessión.

 

Restringir acceso

He creado 2 filtros (custom atrributes) para dar comportamiento a nuestro controladores y/o acciones, es decir que cuando el usuario visite "X" controlador, previamente este debe realizar lo que especifiquemos en los filtros.

using Helper;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace WebApplication1.Tags
{
    // Si no estamos logeado, regresamos al login
    public class AutenticadoAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            if (!SessionHelper.ExistUserInSession())
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
                {
                    controller = "Login",
                    action = "Index"
                }));
            }
        }
    }

    // Si estamos logeado ya no podemos acceder a la página de Login
    public class NoLoginAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            if (SessionHelper.ExistUserInSession())
            {
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
                {
                    controller = "Inicio",
                    action = "Index"
                }));
            }
        }
    }
}
  • Crean dentro de su proyecto una carpeta llamada tags, o el nombre que gusten y copian el código de arriba.
  • No se olviden cambiar el namespace para mantener un orden, en mi caso el namespace se llama WebApplication1.Tags

Que hace cada clase

  • AutenticadoAttribute: hace una validación usando el método ExistUserInSession de la clase SessionHelper para preguntar si el usuario se encuentra logeado, y si la condición fuera falsa, lo redirecciona al controlador y acción que especiquemos. En mi caso he puesto controlador Login y acción index.
  • NoLoginAttribute: esta clase la vamos a usar para que nuestro usuario, una vez que este logeado/autenticado, no pueda volver al controlador del login.

¿Como lo implemento?

Existen 2 formas de implementarlo, a nivel del controlador o de una acción especifica.

[Autenticado]
public class DefaultController : Controller

Nuestro tag se ejecutará al nivel de todo el controlador

 

[Autenticado]
public ActionResult Index()

Nuestro tag se ejecutará solo para la acción especificada.

¡Adquiera ya!

  • Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#

    Software de Portafolio Profesional hecho en ASP.NET MVC 5 C#
  • Código de fuente de Red Social desarrollada en ASP.NET MVC

    Código de fuente de Red Social desarrollada en ASP.NET MVC
  • Software de Venta e Inventario hecho en PHP y Codeigniter

    Software de Venta e Inventario hecho en PHP y Codeigniter

Últimas publicaciones

Encuesta

¿Sobre qué te gustaría que se hable más?

Síguenos

Estudia con nosotros y crece profesionalmente

Nuestros cursos han sido hecho en base a lo que demanda el mercado hoy en día.
La experiencia obtenida es la de un ambiente laboral.

Anexsoft
© 2017 Anexsoft, blog y cursos online de TI.