Filtry autoryzujące w ASP .NET MVC

W ASP.NET MVC istnieją 4 rodzaje filtrów.

  • Filtry autoryzujące
  • Filtry wyjątku
  • Filtry akcji (przed akcją i po akcji)
  • Filtry rezultatu (przed i po wyniku akcji)

Poniżej omówię filtry autoryzujące. Filtrów używa się jak atrybutów i dekoruje się nimi metody akcji.

Filtry autoryzujące są uruchamiane jako pierwsze przez uruchomieniem innych filtrów lub metod akcji.

  • Pierwsza metoda umożliwia Nam stworzenie własnej implementacji interfejsu IAuthorizationFilter i metody OnAuthorizationContext.

    Używanie tej metody nie jest zalecane chyba, że dokładnie wiesz co robisz. Głównie dlatego, że wymyślanie własnych metod zabezpieczeń jest ryzykowne.

  • Drugą metodą jest dziedziczenie po klasie AuthorizeAttribute. Klasa znajduje się w przestrzeni System.Web.Mvc. Piszę to ponieważ, w przestrzeni System.Web istnieje taka sama klasa ale z innymi metodami.

Poniżej kod przedstawiąjący nadpisanie metody AuthorizeCore. Celem jest sprawdzenie czy dany użytkownik może używać danej akcji.

public class AutoryzacjaUlubionych : AuthorizeAttribute
{
    private string uzytkownik;

    public AutoryzacjaUlubionych(string nazwaUzytkownika)
    {
        this.uzytkownik = nazwaUzytkownika;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (uzytkownik == "Przemek")
        {
            return true;
        }

        return false;
    }
}

Wywołanie tej klasy odbywa się poprzez udekorowanie metody akcji nowo powstałym atrybutem. W naszym przypadku AutoryzacjaUlubionych

[AutoryzacjaUlubionych("Przemek")]
public ActionResult Dodaj(string adres)
{
   //
   //Jakiś kod akcji.
   //
}
  • Trzecia metoda jest prostsza i chyba najczęściej stosowana. Pozwala na użycie wbudowanego filtra autoryzacji. Wbudowany filtr umożliwia podanie nazwy użytkownika oraz roli, którą musi posiadać.

Skorzystanie z tej metody polega na udekorowaniu metody akcji atrybutem Authorize, gdzie user oznacza nazwę użytkownika a roles oznacza rolę, którą musi posiadać.

[Authorize(Users = "Przemek", Roles = "Administrator")]
public ActionResult Dodaj(string adres)
{
   //
   //Jakiś kod akcji.
   //
}