UPDATE (giugno 2015): @ daniel-lidström ha correttamente rilevato che non è necessario utilizzare Response.Redirect in un'applicazione ASP.NET MVC. Per ulteriori informazioni sul motivo, vedere questo link: Response.Redirect and ASP.NET MVC – Do Not Mix.
UPDATE (settembre 2014): non sono sicuro quando HandleUnauthorizedRequest è stato aggiunto al AuthorizeAttribute, ma in ogni modo sono stato in grado di perfezionare il codice AuthorizeRedirect in qualcosa di più piccolo e più semplice.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
public string RedirectUrl = "~/Error/Unauthorized";
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
base.HandleUnauthorizedRequest(filterContext);
if (filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.Result = new RedirectResult(RedirectUrl);
}
}
}
Risposta originale Sotto (ancora perfettamente funzionante)
Ho lasciato questa risposta qui come ti dà ancora una comprensione di come le opere di autorizzazione di pipeline.
Per chi arriva ancora qui, ho modificato la risposta di Ben Scheirman al reindirizzamento automatico a una pagina non autorizzata quando l'utente ha effettuato l'accesso ma non è autorizzato. È possibile modificare il percorso di reindirizzamento utilizzando il parametro name RedirectUrl.
EDIT: Ho fatto i thread-safe soluzione grazie ai consigli di Tarynn e MSDN
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class AuthorizeRedirect : AuthorizeAttribute
{
private const string IS_AUTHORIZED = "isAuthorized";
public string RedirectUrl = "~/error/unauthorized";
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
bool isAuthorized = base.AuthorizeCore(httpContext);
httpContext.Items.Add(IS_AUTHORIZED, isAuthorized);
return isAuthorized;
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
var isAuthorized = filterContext.HttpContext.Items[IS_AUTHORIZED] != null
? Convert.ToBoolean(filterContext.HttpContext.Items[IS_AUTHORIZED])
: false;
if (!isAuthorized && filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl);
}
}
}
fonte
2011-03-08 23:15:02
facile da implementare e funziona. Grazie. –
Grazie Ben, realizzo lo stesso dalla mia parte e lavoro molto bene! –
Questa risposta è accettata, ma non è thread-safe, vedere la risposta sotto per maggiori dettagli. Ti preghiamo di aggiornare il tuo codice per essere sicuro, molti sviluppatori potrebbero non leggere altre risposte e usare il tuo come il migliore. –