Tworzę witrynę internetową dla wielu dzierżawców, na której znajdują się strony dla klientów. Pierwszy segment adresu URL będzie ciągiem identyfikującym klienta, zdefiniowanym w Global.asax przy użyciu następującego schematu routingu adresu URL:
"{client}/{controller}/{action}/{id}"
Działa to dobrze w przypadku adresów URL, takich jak / foo / Home / Index.
Jednak gdy używam atrybutu [Authorize], chcę przekierować do strony logowania, która również używa tego samego schematu mapowania. Więc jeśli klient to foo, strona logowania będzie miała postać / foo / Account / Login zamiast stałego / Account / Login przekierowania zdefiniowanego w web.config.
MVC używa HttpUnauthorizedResult, aby zwrócić nieautoryzowany stan 401, który, jak przypuszczam, powoduje przekierowanie ASP.NET do strony zdefiniowanej w web.config.
Czy ktoś wie, jak zastąpić zachowanie przekierowania logowania ASP.NET? A może lepiej byłoby przekierować w MVC, tworząc niestandardowy atrybut autoryzacji?
EDYCJA - Odpowiedź: po zagłębieniu się w źródło .Net zdecydowałem, że niestandardowy atrybut uwierzytelniania jest najlepszym rozwiązaniem:
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 }
});
}
}
}