Estoy creando un sitio web multicliente que aloja páginas para clientes. El primer segmento de la URL será una cadena que identifica al cliente, definida en Global.asax utilizando el siguiente esquema de enrutamiento de URL:
"{client}/{controller}/{action}/{id}"
Esto funciona bien, con URL como / foo / Home / Index.
Sin embargo, cuando uso el atributo [Autorizar], quiero redirigir a una página de inicio de sesión que también usa el mismo esquema de asignación. Entonces, si el cliente es foo, la página de inicio de sesión sería / foo / Account / Login en lugar de la redirección fija / Account / Login definida en web.config.
MVC usa un HttpUnauthorizedResult para devolver un estado 401 no autorizado, que supongo hace que ASP.NET redirija a la página definida en web.config.
Entonces, ¿alguien sabe cómo anular el comportamiento de redireccionamiento de inicio de sesión de ASP.NET? ¿O sería mejor redirigir en MVC creando un atributo de autorización personalizado?
EDITAR - Respuesta: después de investigar un poco la fuente .Net, decidí que un atributo de autenticación personalizado es la mejor solución:
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 }
});
}
}
}