Я створюю веб-сайт із багатоквартирною орендою, на якому розміщуються сторінки для клієнтів. Першим сегментом URL-адреси буде рядок, який ідентифікує клієнта, визначений у Global.asax за допомогою такої схеми маршрутизації URL-адрес:
"{client}/{controller}/{action}/{id}"
Це чудово працює з такими URL-адресами, як / foo / Home / Index.
Однак, використовуючи атрибут [Authorize], я хочу перенаправити на сторінку входу, яка також використовує ту саму схему відображення. Отже, якщо клієнт є foo, сторінкою входу буде / foo / Account / Login замість фіксованого / Account / Login перенаправлення, визначеного в web.config.
MVC використовує HttpUnauthorizedResult для повернення статусу несанкціонованого 401, який, як я вважаю, призводить до перенаправлення ASP.NET на сторінку, визначену в web.config.
Тож хтось знає, як замінити поведінку перенаправлення входу ASP.NET? Або було б краще перенаправити в MVC, створивши власний атрибут авторизації?
РЕДАГУВАТИ - Відповідь: після деякого копання у джерелі .Net я вирішив, що найкращий атрибут автентифікації - найкраще рішення:
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 }
});
}
}
}