Estoy creando un sitio web multi-tenancy que aloja páginas para clientes. El primer segmento de la URL será una cadena que identifica al cliente, formada en Global.asax usando el siguiente esquema de enrutamiento de URL:Cómo redirigir a una URL de inicio de sesión dinámica en ASP.NET MVC
"{client}/{controller}/{action}/{id}"
Esto funciona bien, con direcciones URL como/foo/Home/Índice.
Sin embargo, cuando se utiliza el atributo [Autorizar], quiero redirigir a una página de inicio de sesión que también utiliza 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, lo que presumo hace que ASP.NET redirija a la página definida en web.config.
¿Alguien sabe ya cómo anular el comportamiento de redirección 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 algo de investigación en la fuente de .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 }
});
}
}
}
hacer casi exactamente lo mismo con el enrutamiento, así que necesitaba esto! ¡Gracias! –
Gracias, estaba tratando de descubrir cómo hacer algo similar. – Chance
me dio idea para su propia implementación, ¡muchas gracias! –