Estou criando um site multilocação que hospeda páginas para clientes. O primeiro segmento da URL será uma string que identifica o cliente, definida em Global.asax usando o seguinte esquema de roteamento de URL:
"{client}/{controller}/{action}/{id}"
Isso funciona bem com URLs como / foo / Home / Index.
No entanto, ao usar o atributo [Autorizar], desejo redirecionar para uma página de login que também usa o mesmo esquema de mapeamento. Portanto, se o cliente for foo, a página de login seria / foo / Account / Login em vez do redirecionamento fixo / Account / Login definido em web.config.
O MVC usa um HttpUnauthorizedResult para retornar um status 401 de não autorizado, que presumo que faz com que o ASP.NET redirecione para a página definida em web.config.
Então, alguém sabe como substituir o comportamento de redirecionamento de login do ASP.NET? Ou seria melhor redirecionar em MVC criando um atributo de autorização personalizado?
EDIT - Resposta: após algumas pesquisas na fonte .Net, decidi que um atributo de autenticação personalizado é a melhor solução:
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 }
});
}
}
}