Подтвердить что ты не робот

ASP.NET MVC: Response.Redirect(url, TRUE) не останавливает обработку запроса

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

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

RequiresAuthentication атрибут исходит из этой статьи

Внутри 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;
        }
    }
4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

Добавить

filterContext.HttpContext.Response.Clear();

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

filterContext.HttpContext.Response.End();

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

Ответ 4

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