Cómo proteger todas las páginas de tu sitio web con AuthorizeAttribute

En aplicaciones Web Forms puedes utilizar web.config para proteger diferentes rutas a páginas o a carpetas de tu aplicación. Esto funciona bien porque estás protegiendo páginas, que a final de cuentas son archivos físicos y conoces la ruta exacta por medio de la cual la gente las visitará.

En ASP.NET MVC contamos con Controllers que pueden ser accedidos mediante diferentes rutas. Aunque todavía es posible proteger estas rutas con el archivo Web.config no se recomienda hacerlo porque es muy probable que pases por alto alguna de las diferentes formas en que se accede un controlador específico. Tarde o temprano cometerás algún error, dejando tu aplicación vulnerable.

La forma de proteger un controlador es mediante el atributo Authorize, por ejemplo:

[Authorize]
public class LocutorController : Controller
{
   // GET: Locutor
   public ActionResult Index()
   {
      return View();
   }
}

O bien, puedes proteger únicamente una acción:

public class LocutorController : Controller
{
   // GET: Locutor
   [Authorize]
   public ActionResult Index()
   {
      return View();
   }
}

Otra opción es permitir el acceso para ciertos usuarios o roles:

[Authorize(Users = "Juan, Pedro")]
public ActionResult Index()
{
   return View();
}

[Authorize(Roles = "Admin, Editor")]
public ActionResult IndexDos()
{
   return View();
}

Si tu aplicación es primordialmente de acceso público y solamente tienes que proteger unos cuantos controladores, esto funciona bien.

¿Pero que pasa si tu aplicación es completamente cerrada? ¿Por ejemplo un panel de control para administrar el seguimiento de clientes y cotizaciones? En ese caso tendrías que recordar escribir estos atributos en todos tus controladores, y cuando añadas uno nuevo meses después y olvides hacerlo, quedará desprotegido.

En este caso puedes usar la lógica contraria: Proteger todo excepto el inicio de sesión.

Para proteger todo, fíjate primero como en el archivo Global.asax de tu aplicación aparece FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);.

Vamos a agregar algo en la función RegisterGlobalFilters, para lo cual debes abrir el archivo FilterConfig.cs que aparece en la carpeta App_Start.

Añade AuthorizeAttribute usando la línea 4:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
   filters.Add(new HandleErrorAttribute());
   filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}

Esto protegerá todos tus controladores. Para abrir el acceso a algunos de ellos (en nuestro ejemplo únicamente los controladores de login) hazlo así:

[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
   ViewBag.ReturnUrl = returnUrl;
   return View();
}

De hecho verás que cuando creas una aplicación con Visual Studio ya están añadidos estos atributos en las acciones Login y Register del controlador AccountController.

Ahora ya no es necesario utilizar [Authorize] en cada controlador o acción, todas están protegidas. Solamente tendrás que hacerlo para utilizar roles o usuarios como se describe arriba.