Я думаю, что основной вопрос - то, что, если Вы собираетесь осуществить контрейлерные перевозки на встроенном классе ASP.NET FormsAuthentication (и нет никакого серьезного основания, Вы не были должны), что-то в конце дня собирается звонить FormsAuthentication.RedirectToLoginPage()
, который собирается посмотреть на настроенный URL того. Существует только один URL входа в систему, когда-либо, и это, как они разработали его.
Мой удар в проблеме (возможно реализация Rube Goldberg) должен был бы позволить ему перенаправить к единственной странице входа в систему в корне, совместно использованном всеми клиентами, сказать/account/login. Эта страница входа в систему ничего на самом деле не отобразила бы; это осматривает или параметр ReturnUrl или некоторое значение, я вошел в сессию или cookie, который идентифицирует клиент и использование что выпустить непосредственные 302 перенаправления к определенной/client/account/login странице. Это - дополнительное перенаправление, но вероятно не примечательное и это позволяет Вам использовать созданный в механизмах перенаправления.
другая опция состоит в том, чтобы создать Ваш собственный атрибут, как Вы описываете и избегаете чего-либо, что звонит RedirectToLoginPage()
метод на FormsAuthentication
класс, так как Вы будете заменять его своей собственной логикой перенаправления. (Вы могли бы создать свой собственный класс, который подобен.), Так как это - статический класс, я не знаю ни о каком механизме, которым Вы могли просто ввести свой собственный альтернативный интерфейс и иметь его, волшебно работают с существующим [Авторизовывают] атрибут, который дует, но , люди сделали подобные вещи прежде .
Hope, которая помогает!
В RTM-версии ASP.NET MVC свойство «Отмена» отсутствует. Этот код работает с ASP.NET MVC RTM:
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;
namespace ePegasus.Web.ActionFilters
{
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{ "langCode", filterContext.RouteData.Values[ "langCode" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
}
Изменить: Вы можете отключить аутентификацию с помощью форм по умолчанию loginUrl в web.config - на случай, если кто-то забудет, что у вас есть настраиваемый атрибут, и использует встроенный [Authorize] атрибут по ошибке.
Измените значение в web.config:
<forms loginUrl="~/Account/ERROR" timeout="2880" />
Затем создайте метод действия 'ERROR', который регистрирует ошибку и перенаправляет пользователя на наиболее распространенную страницу входа в систему.
Мое решение этой проблемы - специальный класс ActionResult
:
sealed public class RequiresLoginResult : ActionResult
{
override public void ExecuteResult (ControllerContext context)
{
var response = context.HttpContext.Response;
var url = FormsAuthentication.LoginUrl;
if (!string.IsNullOrWhiteSpace (url))
url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);
response.Clear ();
response.StatusCode = 302;
response.RedirectLocation = url;
}
public RequiresLoginResult (string returnUrl = null)
{
ReturnUrl = returnUrl;
}
string ReturnUrl { get; set; }
}