Ajouter quelque chose comme ceci à votre site web.config:
<customErrors mode="On" defaultRedirect="~/Login">
<error statusCode="401" redirect="~/Unauthorized" />
<error statusCode="404" redirect="~/PageNotFound" />
</customErrors>
Vous devez évidemment créer l' /PageNotFound
et /Unauthorized
routes, les actions et les points de vue.
EDIT: je suis désolé, j'ai apparemment ne comprends pas le problème de fond.
Le problème est que lorsque l' AuthorizeAttribute
filtre est exécuté, il décide que l'utilisateur ne correspond pas aux exigences (il/elle peut être connecté, mais n'est pas dans un bon rôle). Il présente, par conséquent, le code d'état de réponse à 401. C'est intercepté par l' FormsAuthentication
module qui seront ensuite effectuer la redirection.
Je vois deux solutions:
Désactiver le defaultRedirect.
Créez votre propre IAuthorizationFilter
. Dériver de l' AuthorizeAttribute
et remplacer HandleUnauthorizedRequest. Dans cette méthode, si l'utilisateur est authentifié faire une redirection vers /non autorisée
Je n'aime pas non plus: le defaultRedirect fonctionnalité est agréable et pas quelque chose que vous voulez mettre en œuvre vous-même. La deuxième approche se traduit par l'utilisateur du fait que visuellement correcte "Vous n'êtes pas autorisé"-page, mais les codes d'état HTTP ne sera pas souhaité 401.
Je ne sais pas assez sur HttpModules de dire si cela peut être contourné avec une tolérable hack.
EDIT 2:
Comment à propos de la mise en œuvre de votre propre IAuthorizationFilter de la manière suivante: télécharger le MVC2 code de CodePlex et "emprunter" le code pour AuthorizeAttribute. Modifier la OnAuthorization méthode pour ressembler à
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (AuthorizeCore(filterContext.HttpContext))
{
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
// Is user logged in?
else if(filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// Redirect to custom Unauthorized page
filterContext.Result = new RedirectResult(unauthorizedUrl);
}
else {
// Handle in the usual way
HandleUnauthorizedRequest(filterContext);
}
}
où unauthorizedUrl
est soit un bien sur le filtre ou le lire à partir du Web.config.
Vous pouvez également hériter de AuthorizeAttribute et remplacer OnAuthorization
, mais vous allez finir par l'écriture d'un couple de méthodes privées qui sont déjà dans AuthorizeAttribute.