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;
}
}
Ответы
Ответ 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
необходимо для выхода из текущей области, если вы находитесь в любом месте.