Я создаю мультитенантный веб-сайт, на котором размещаются страницы для клиентов. Первый сегмент 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 }
});
}
}
}
Ответы:
Я думаю , что главная проблема в том , что если вы собираетесь контрейлерных на встроенном в ASP.NET классе FormsAuthentication (и нет никаких причин , вы не должны), что - то в конце дня будет призыв ,
FormsAuthentication.RedirectToLoginPage()
который будет чтобы посмотреть на один настроенный URL. Всегда есть только один URL-адрес для входа, и именно так они его разработали.Мой удар по проблеме (возможно, реализация Руба Голдберга) состоял бы в том, чтобы позволить ей перенаправить на единую страницу входа в корневой каталог, общий для всех клиентов, скажем / account / login. Эта страница входа фактически ничего не отображает; он проверяет либо параметр ReturnUrl, либо какое-либо значение, которое я получил в сеансе, или файл cookie, который идентифицирует клиента и использует его для немедленного перенаправления 302 на конкретную страницу / client / account / login. Это дополнительное перенаправление, но, скорее всего, незаметное и позволяет использовать встроенные механизмы перенаправления.
Другой вариант - создать свой собственный настраиваемый атрибут по мере вашего описания и избегать всего, что вызывает
RedirectToLoginPage()
метод вFormsAuthentication
классе, поскольку вы замените его своей собственной логикой перенаправления. (Вы можете создать свой собственный аналогичный класс.) Поскольку это статический класс, я не знаю ни одного механизма, с помощью которого вы могли бы просто внедрить свой собственный альтернативный интерфейс и заставить его волшебным образом работать с существующим атрибутом [Authorize], который удары, но люди делали подобное и раньше .Надеюсь, это поможет!
источник
Application_AuthenticateRequest
(см. Мой ответ ниже).В RTM-версии ASP.NET MVC свойство Cancel отсутствует. Этот код работает с ASP.NET MVC RTM:
Изменить: вы можете отключить проверку подлинности форм по умолчанию loginUrl в web.config - на случай, если кто-то забудет, что у вас есть настраиваемый атрибут, и по ошибке использует встроенный атрибут [Authorize].
Измените значение в web.config:
Затем создайте метод действия ERROR, который регистрирует ошибку и перенаправляет пользователя на самую общую страницу входа в систему.
источник
Моим решением этой проблемы стал собственный
ActionResult
класс:источник
Тем не менее, если один решает использовать встроенный в ASP.NET FormsAuthentication, можно overide
Application_AuthenticateRequest
вGlobal.asax.cs
следующим образом :источник