Каков наилучший способ сделать перенаправление в ActionFilterAttribute
. Я ActionFilterAttribute
вызвал IsAuthenticatedAttributeFilter
и проверил значение переменной сеанса. Если переменная имеет значение false, я хочу, чтобы приложение перенаправляло на страницу входа. Я бы предпочел перенаправить, используя имя маршрута, SystemLogin
однако любой метод перенаправления на этом этапе будет в порядке.
c#
asp.net-mvc
asp.net-mvc-3
redirect
routes
ryanzec
источник
источник
Ответы:
Установить filterContext.Result
С названием маршрута:
Вы также можете сделать что-то вроде:
Если вы хотите использовать
RedirectToAction
:Вы можете создать открытый
RedirectToAction
метод на вашем контроллере ( предпочтительно на его базовом контроллере ), который просто вызывает защищенныйRedirectToAction
отSystem.Web.Mvc.Controller
. Добавление этого метода позволяет для публичного вызова своихRedirectToAction
контекстуальных из фильтра.Тогда ваш фильтр будет выглядеть примерно так:
источник
protected
так что у вас не будет доступа к нему из фильтра.protected
должно быть какое-то разумное объяснение? Я чувствую себя очень грязно, переопределяя эту доступность,RedirectToAction
не понимая, почему она была заключена в капсулу.В качестве альтернативы перенаправлению, если он вызывает ваш собственный код, вы можете использовать это:
Это не просто перенаправление, но дает аналогичный результат без лишних затрат.
источник
actionContext.Result.ExecuteResult
из вашего фильтра действий - MVC сделает это автоматически после запуска фильтра действий (при условии, чтоactionContext.Result
он не равен нулю).Я использую MVC4, я использовал следующий подход, чтобы перенаправить пользовательский экран HTML при нарушении авторизации.
Расширить
AuthorizeAttribute
скажемCutomAuthorizer
переопределитьOnAuthorization
иHandleUnauthorizedRequest
Зарегистрируйтесь
CustomAuthorizer
вRegisterGlobalFilters
.после идентификации
unAuthorized
вызова доступаHandleUnauthorizedRequest
и перенаправления на соответствующее действие контроллера, как показано ниже.источник
Похоже, вы хотите повторно реализовать или, возможно, расширить
AuthorizeAttribute
. Если это так, вам следует убедиться, что вы наследуете это, а не такActionFilterAttribute
, чтобы ASP.NET MVC выполнял за вас большую часть работы.Кроме того, вы хотите убедиться, что вы авторизуетесь, прежде чем выполнять какую-либо реальную работу в методе действия - в противном случае единственная разница между тем, кто вошел в систему и не будет, заключается в том, какую страницу вы видите, когда работа выполнена.
Есть хороший вопрос с ответом с более подробной информацией о SO.
источник
Попробуйте следующий фрагмент, это должно быть довольно ясно:
источник
Вот решение, которое также учитывает, если вы используете запросы Ajax.
источник
Это работает для меня (asp.net core 2.1)
источник
Вы можете унаследовать свой контроллер, а затем использовать его внутри фильтра действий
внутри вашего класса ActionFilterAttribute:
внутри вашего базового контроллера:
Cons. это изменить все контроллеры для наследования от класса "MyController"
источник