Je crée un site Web mutualisé qui héberge des pages pour les clients. Le premier segment de l'URL sera une chaîne qui identifie le client, définie dans Global.asax à l'aide du schéma de routage d'URL suivant:
"{client}/{controller}/{action}/{id}"
Cela fonctionne bien, avec des URL telles que / foo / Home / Index.
Cependant, lorsque j'utilise l'attribut [Authorize], je souhaite rediriger vers une page de connexion qui utilise également le même schéma de mappage. Donc, si le client est foo, la page de connexion serait / foo / Account / Login au lieu de la redirection fixe / Account / Login définie dans web.config.
MVC utilise un HttpUnauthorizedResult pour renvoyer un statut 401 non autorisé, ce qui, je suppose, oblige ASP.NET à rediriger vers la page définie dans web.config.
Alors, est-ce que quelqu'un sait comment remplacer le comportement de redirection de connexion ASP.NET? Ou serait-il préférable de rediriger dans MVC en créant un attribut d'autorisation personnalisé?
EDIT - Réponse: après quelques fouilles dans la source .Net, j'ai décidé qu'un attribut d'authentification personnalisé était la meilleure solution:
public class ClientAuthorizeAttribute: AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
base.OnAuthorization( filterContext );
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}