Sto creando un sito web multi-tenancy che ospita pagine per i clienti. Il primo segmento dell'URL sarà una stringa che identifica il client, definito in Global.asax utilizzando il seguente schema di instradamento dell'URL:
"{client}/{controller}/{action}/{id}"
Funziona bene, con URL come / foo / Home / Index.
Tuttavia, quando si utilizza l'attributo [Autorizza], desidero reindirizzare a una pagina di accesso che utilizza anche lo stesso schema di mappatura. Quindi, se il client è foo, la pagina di accesso sarebbe / foo / Account / Login invece del reindirizzamento fisso / Account / Login definito in web.config.
MVC utilizza un HttpUnauthorizedResult per restituire uno stato 401 non autorizzato, che presumo faccia reindirizzare ASP.NET alla pagina definita in web.config.
Quindi qualcuno sa come sovrascrivere il comportamento di reindirizzamento dell'accesso ASP.NET? O sarebbe meglio reindirizzare in MVC creando un attributo di autorizzazione personalizzato?
EDIT - Risposta: dopo aver scavato un po 'nella fonte .Net, ho deciso che un attributo di autenticazione personalizzato è la soluzione migliore:
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 }
});
}
}
}