2010-02-02 2 views
12

У меня есть метод, украшенный двумя пользовательскими ActionFilterAttribute.ASP.NET MVC: Response.Redirect (url, TRUE) не останавливает обработку запроса

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

RequiresAuthentication атрибут исходит из this article

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

ответ

26

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

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

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

У меня есть код custom authorization в моем блоге http://farm-fresh-code.blogspot.com.

+0

Это оказался ответ, который мне нужен - я делал перенаправление на Response, и в течение нескольких месяцев я не мог понять, почему я получаю ошибки «Can not set cookie». –

2

попытка добавления [Авторизовать] атрибут к вашим методам действий вместо

+0

Да, это тоже сработает, если у вас нет более сложного сценария авторизации/аутентификации. – tvanfosson

2

Добавить

filterContext.HttpContext.Response.Clear(); 

на первый и это по окончанию:

filterContext.HttpContext.Response.End(); 

Надеется, что это помогает.

+2

Не помогло: filterContext.HttpContext.Response.Redirect (loginUrl, true); уже делает это внутри. –

0

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

Смежные вопросы