Sto utilizzando un ActionFilterAttribute per eseguire la logica di autenticazione personalizzata. L'attributo verrà utilizzato solo su una classe Controller derivata che contiene la mia logica di autenticazione.ActionFilterAttribute - si applica alle azioni di un tipo di controller specifico
Ecco il mio controller, derivato dalla mia classe di controllo personalizzato, e un attributo di esempio:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
Ecco un esempio del mio ActionFilterAttribute:
public class CustomAuthorizeAttribute : ActionFilterAttribute
{
public MyUserTypes UserType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
myUser user = ((CustomControllerBase)filterContext.Controller).User;
if(!user.isAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
}
}
funziona alla grande.
Ecco la domanda: Posso richiedere che questo attributo venga utilizzato SOLO su Azioni nel mio tipo di controller personalizzato?
Il tuo attributo è danneggiato perché non eredita da AuthroizeAttribute e pertanto non è garantito l'esecuzione quando l'azione viene memorizzata nella cache. Vedi http://blogs.teamb.com/craigstuntz/2009/09/09/38390/ per le soluzioni che funzionano con il caching. –
Perché il risultato dell'azione dovrebbe essere memorizzato nella cache? –
Sarebbe memorizzato nella cache perché qualcuno ha detto di essere memorizzato nella cache. Immagina che qualcuno inserisca l'attributo Cache in una classe genitore, senza notare l'attributo rotto nel sottotipo. È un'idea molto migliore utilizzare un attributo che non sia fondamentalmente incompatibile con la memorizzazione nella cache di ASP.NET/MVC. Vedi il link sopra per le opzioni. –