MISE À JOUR (juin 2015): @ daniel-lidström a correctement signalé que vous ne devriez pas utiliser Response.Redirect dans une application ASP.NET MVC. Pour plus d'informations sur pourquoi, s'il vous plaît voir ce lien: Response.Redirect and ASP.NET MVC – Do Not Mix.
MISE À JOUR (septembre 2014): Je ne sais pas quand HandleUnauthorizedRequest a été ajouté à la AuthorizeAttribute, mais de toute façon j'ai été en mesure de préciser le code AuthorizeRedirect en quelque chose de plus petit et plus simple.
[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);
}
}
}
Réponse originale ci-dessous (encore pleinement fonctionnel)
J'ai laissé cette réponse ici car il vous donne encore un aperçu de la façon dont les travaux de pipeline d'autorisation.
Pour tous ceux qui atterrissent ici, j'ai modifié la réponse de Ben Scheirman pour rediriger automatiquement vers une page non autorisée lorsque l'utilisateur est connecté mais pas autorisé. Vous pouvez modifier le chemin de redirection à l'aide du paramètre de nom RedirectUrl.
EDIT: J'ai fait le thread-safe solution grâce aux conseils de Tarynn et 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);
}
}
}
Facile à mettre en œuvre et cela fonctionne. Merci. –
Merci Ben, je mets en place la même chose de mon côté et fonctionne très bien! –
Cette réponse est acceptée, mais elle n'est pas sûre pour les threads, veuillez voir la réponse ci-dessous pour plus de détails. Veuillez mettre à jour votre code pour qu'il soit sans danger pour les threads, beaucoup de développeurs peuvent ne pas lire d'autres réponses et utiliser le vôtre comme le meilleur. –