Rozšířený AuthorizeAttribute v ASP.NET MVC

Tomáš Jecha       28. 1. 2010       C#, ASP.NET/IIS       6592 zobrazení

AuthorizeAttribute je základním autorizačním principem v ASP.NET MVC. Odekorování akce nebo celého controlleru dovoluje omezit přístup pouze pro seznam uživatelů, popřípadě rolí poskytovaných RoleProviderem.

V případě neúspěšné autorizace se vrací HttpUnauthorizedResult, který zapíše do výstupu HTTP kód 401 (neautorizovaný přístup) a z něj se provede přesměrování na přihlašovací obrazovku. Pokud chcete po neúspěšné autorizaci přesměrovat jinam, lze to připravit jednoduchým rozšířením právě AuthorizeAttribute:

 /// <summary>
///
Atribut rozšiřující <see cref="AuthorizeAttribute"/> o možnost přesměrovat na jinou adresu než je defaultní přihlašovací v případě neúspěšné autorizace.
/// </summary>
public class AuthorizeRedirectAttribute : AuthorizeAttribute
{
    
/// <summary>
    /// Vrací nebo nastavuje akci, na kterou se provede přesměrování při neúspěšné autorizaci
    /// </summary>
    public string RedirectAction { get; set; }

    
/// <summary>
    /// Vrací nebo nastavuje controller, na který se provede přesměrování při neúspěšné autorizaci
    /// </summary>
    public string RedirectController { get; set; }

    
/// <summary>
    /// Vrací nebo nastavuje route values, které se předají akci při přesměrování při neúspěšné autorizaci
    /// </summary>
    public object RedirectRouteValues { get; set; }

    
public override void OnAuthorization(AuthorizationContext filterContext)
     {
        
base.OnAuthorization(filterContext);

        
// neuatorizovany pozadavek?
        if (filterContext.Result is HttpUnauthorizedResult)
         {
            
// vygenerovat adresu pro presmerovani
            string redirectUrl = new UrlHelper(filterContext.RequestContext).Action(RedirectAction, RedirectController, RedirectRouteValues);

            
// presmerovat
            filterContext.Result = new RedirectResult(redirectUrl);
         }
     }
}

Takto upravenému atributu předáte akci a případně i controller a route values a přesměrování při neautorizovaném přístupu bude obstaráno automaticky. Například:

 [AuthorizeRedirect(RedirectAction = "RegistrationAbout")]
public ActionResult MyProfile()

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Diskuse: Rozšířený AuthorizeAttribute v ASP.NET MVC

Ahoj, vylepšení AuthorizeAttribute vypadá zajímavě, měl bych však dotaz k jeho použití. Jakým způsobem nastavím property RedirectRouteValues, když je typu object a např.

[AuthorizeRedirect(RedirectAction = "UnauthorizedRequest", RedirectRouteValues = new { area="forum" }, Roles = "Admin")]
public ActionResult RemoveThread()
{
...
}

udělat nemohu, kvůli dynamické inicializaci anonymního typu v atributu. Jedná se konkrétně o přesměrování do jiné area, popř. přidat další parametry k uvedené routě.

Děkuji za odpověď, Fero

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback