En esta entrada construiremos un prototipo de configuración de autorización para ASP.NET MVC. En el Web.config de la aplicación asociaremos las acciones del controlador con los roles que estarían autorizados. Para este caso tendremos una aplicación con tres roles: Administrator, Advanced, Limited.
Lo primero que crearemos será la sección de configuración que nos permitirá especificar la autorización a los distinos roles de la aplicación. Para ello, en el apartado <configsections> de nuestro web.config crearemos una sección de configuración:
<configSections> <section name="MyMvcAuthorization" type="System.Configuration.NameValueSectionHandler,System,Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> </configSections>
El modelo
En la carpeta models de nuestro proyecto agregaré un archivo Model.cs y escribiré el siguiente código:
namespace MVCAuthorization { public class Person { public string Name { get; set; } public int Id { get; set; } } }
Como ven, se trata de un POCO bastante sencillo. Vamos con el controller:
El controller
Una clase controladora sencilla:
namespace MVCAuthorization.Controllers
{
public class PersonsController : MyBaseController
{
List<Person> persons = new List<Person>();
//
// GET: /Persons/
[Authorize()]
public ActionResult Index()
{
Person firstPerson = new Person
{
Id = 1,
Name = "Fulano de Tal"
};
Person secondPerson = new Person
{
Id = 2,
Name = "Sutano de Tal"
};
persons.Add(firstPerson);
persons.Add(secondPerson);
return View();
}
//
// GET: /Persons/Details/5
[Authorize()]
public ActionResult Details(int id)
{
Person person = persons
.FirstOrDefault(it => it.Id == id);
return View(person);
}
//
// GET: /Persons/Create
[Authorize()]
public ActionResult Create()
{
return View();
}
//
// POST: /Persons/Create
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Person person)
{
try
{
// TODO: Add insert logic here
persons.Add(person);
return RedirectToAction("Index");
}
catch
{
return View();
}
}
//
// GET: /Persons/Edit/5
[Authorize()]
public ActionResult Edit(int id)
{
return View();
}
//
// POST: /Persons/Edit/5
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, FormCollection collection)
{
try
{
// TODO: Add update logic here
return RedirectToAction("Index");
}
catch
{
return View();
}
}
}
}
De esta clase controladora quiero que notemos dos cosas interesantes: en primer lugar, que la clase hereda de MyBaseController. La implementación de esa clase base la pondré aquí más adelante, dado que es esta clase la que se encargará de verificar si una acción está autorizada a un usuario en un rol determinado. En segundo lugar, que cada método (puntualmente cada GET) está decorado con el atributo [Authorize()]. Esto obligará a los usuarios no autenticados a loguearse. Y obligará, también, a que la clase base, como lo veremos más adelante, verifique para dichos métodos la autorización.
Lo que se hará a continuación es establecer, de esta clase controladora, los permisos de los roles frente a los métodos de acción. Para ello volvemos al web.config y agregamos la sección MyMvcAuthorization, que hemos definido anteriormente y que es un Dictionary tradicional: