2010-02-02 8 views
12

Mam metodę ozdobioną dwiema niestandardowymi ActionFilterAttribute.ASP.NET MVC: Response.Redirect (url, TRUE) nie zatrzymuje przetwarzania żądań

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

RequiresAuthentication atrybut pochodzi this article

Wewnątrz RequiresAuthentication, na jego OnActionExecuting zrobić:

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

Linia jest zostanie wykonany, a argumenty są, jak oczekiwano. Problem polega na tym, że po wykonaniu powyższej linii otrzymuję następny atrybut (ActionFilterAttribute), tak jakby przekierowanie nie działało, po prostu kontynuuje wykonywanie żądania, zamiast po prostu przekierować przeglądarkę.

Pytanie: co jeszcze muszę zrobić, aby procedura obsługi życzenie

Jest to kompletna metoda:

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; 
     } 
    } 

Odpowiedz

26

Chcesz ustawić wynik w oknie dialogowym filtra na wartość przekierowania, a nie przekierować odpowiedź.

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

EDIT: W @Hunter Daley sugeruje lepszy mechanizm byłoby użyć AuthorizeAttribute zamiast jeśli działa dla Ciebie. Jeśli masz scenariusze uwierzytelniania/autoryzacji, dla których atrybut AuthorizeAttribute nie działa, prawdopodobnie lepszym rozwiązaniem byłoby wyprowadzenie z niego niestandardowego atrybutu zamiast bardziej ogólnej akcji ActionFilterAttribute. W każdym razie właściwą techniką jest ustawienie wyniku, a nie bezpośrednia interakcja z odpowiedzią. Możesz zajrzeć do rzeczywistego źródła AuthorizeAttribute pod http://www.codeplex.com/aspnet po pomysły.

Mam również próbkę kodu custom authorization na moim blogu, http://farm-fresh-code.blogspot.com.

+0

To była odpowiedź, której potrzebowałem - robiłem przekierowanie na odpowiedź i przez miesiące nie mogłem się domyślić, dlaczego otrzymuję błędy "Nie mogę ustawić cookie". –

2

try dodając [Autoryzuj] atrybut do swoich metod działania zamiast

+0

tak, to też działa, chyba że masz bardziej skomplikowany scenariusz autoryzacji/uwierzytelniania. – tvanfosson

2

Dodaj

filterContext.HttpContext.Response.Clear(); 

w pierwszym i to na końcu:

filterContext.HttpContext.Response.End(); 

nadzieję, że to pomaga.

+2

Nie pomogło: filterContext.HttpContext.Response.Redirect (loginUrl, true); już robi to w środku. –

0

można użyć return RedirectToAction("Index", "Home/Login", new {area = "", returnURL = Request.Url.AbsolutePath}); , aby zatrzymać bieżące przetwarzanie, przekierować do żądanej strony (logowania) i zamknąć działanie. Właściwość route jest potrzebna, aby wydostać się z bieżącego obszaru, jeśli jesteś w jakimkolwiek.

Powiązane problemy