Saya membuat situs web multi-tenancy yang menghosting halaman untuk klien. Segmen pertama URL akan menjadi string yang mengidentifikasi klien, ditentukan di Global.asax menggunakan skema perutean URL berikut:
"{client}/{controller}/{action}/{id}"
Ini berfungsi dengan baik, dengan URL seperti / foo / Home / Index.
Namun, saat menggunakan atribut [Otorisasi], saya ingin mengalihkan ke halaman login yang juga menggunakan skema pemetaan yang sama. Jadi jika klien adalah foo, halaman login akan menjadi / foo / Akun / Login alih-alih pengalihan tetap / Akun / Login yang ditentukan di web.config.
MVC menggunakan HttpUnauthorizedResult untuk mengembalikan status tidak sah 401, yang saya anggap menyebabkan ASP.NET mengalihkan ke halaman yang ditentukan di web.config.
Jadi, apakah ada yang tahu cara menimpa perilaku pengalihan login ASP.NET? Atau akankah lebih baik untuk mengalihkan di MVC dengan membuat atribut otorisasi khusus?
EDIT - Jawaban: setelah menggali sumber .Net, saya memutuskan bahwa atribut otentikasi khusus adalah solusi terbaik:
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 }
});
}
}
}