ASP.NET MVC: Response.Redirect (url, TRUE) не останавливает обработку запроса - PullRequest
12 голосов
/ 02 февраля 2010

У меня есть метод, украшенный двумя пользовательскими ActionFilterAttribute.

[RequiresAuthentication(Order = 1)]
[ToonAction(Order = 2)]
public ActionResult Browse(...

RequiresAuthentication атрибут взят из этой статьи

Внутри требуется Аутентификация, на ней OnActionExecuting Я делаю:

 filterContext.HttpContext.Response.Redirect(loginUrl, true);

Строка - это , выполняемая, и все аргументы соответствуют ожиданиям. Проблема в том, что после выполнения строки выше я получаю следующий атрибут (ActionFilterAttribute), как если бы перенаправление не работало, он просто продолжает выполнять запрос вместо простого перенаправления браузера.

Вопрос: что еще мне нужно сделать, чтобы обработчик запросов

Это полный метод:

    public override void OnActionExecuting(ActionExecutingContext filterContext) {
        //redirect if not authenticated
        var identity = filterContext.HttpContext.User.Identity;
        if (!identity.IsAuthenticated) {
            //use the current url for the redirect
            string redirectOnSuccess = filterContext.HttpContext.Request.Url.PathAndQuery;

            //send them off to the login page
            string redirectUrl = string.Format("?ReturnUrl={0}", redirectOnSuccess);
            string loginUrl = FormsAuthentication.LoginUrl + redirectUrl;
            filterContext.HttpContext.Response.Redirect(loginUrl, true);
            // filterContext.Result = new HttpUnauthorizedResult();
            // filterContext.HttpContext.Response.StatusCode = 0x191;
        }
    }

Ответы [ 5 ]

26 голосов
/ 02 февраля 2010

Вы хотите установить Result для filterContext равным RedirectResult, а не перенаправлять ответ.

 filterContext.Result = new RedirectResult { Url = loginUrl };

РЕДАКТИРОВАТЬ: Как @Hunter Daley предлагает лучший механизм будет использовать вместо этого AuthorizeAttribute, если он работает для вас. Если у вас есть сценарии аутентификации / авторизации, для которых не работает AuthorizeAttribute, вероятно, было бы лучше извлечь из него ваш пользовательский атрибут, а не более общий ActionFilterAttribute. В любом случае, правильный метод - установить результат, а не напрямую взаимодействовать с ответом. Возможно, вы захотите взглянуть на фактический источник AuthorizeAttribute в http://www.codeplex.com/aspnet для идей.

В моем блоге есть образец кода пользовательской авторизации , http://farm -fresh-code.blogspot.com , тоже.

2 голосов
/ 02 февраля 2010

Добавить

filterContext.HttpContext.Response.Clear();

сначала и это в конце:

filterContext.HttpContext.Response.End();

Надеюсь, это поможет.

2 голосов
/ 02 февраля 2010

попробуйте добавить атрибут [Authorize] к вашим методам действия вместо

0 голосов
/ 07 августа 2018

Добавьте этот код перед перенаправлением страницы.

filterContext.ExceptionHandled = true;
0 голосов
/ 22 апреля 2014

Вы можете использовать return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath});, чтобы остановить текущую обработку, перенаправить на нужную страницу (логин) и выйти из действия.свойство маршрута area необходимо для выхода из текущей области, если вы находитесь в любом из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...