2011-07-19 14 views
5

Jak mogę przerwać wykonywanie działań/kontrolera bez przekierowania, a jedynie zwrócić odpowiedź z StatusCodeASP.NET MVC3 Zatrzymaj wykonywanie działań/kontroler w zwyczaju AuthorizeAttribute

public class MainAuthorizationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     ... [my Authorization login] ... 

     if([Authorization fail]) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 401; 
       // HERE I want stop executing action/controller because I want return only statusCode 
      } 
      else 
      { 
        // In non-ajax request I just redirect me request and action/contoller isn't executed 
        filterContext.Result = new RedirectToRouteResult("Error", new RouteValueDictionary { { "errorCode", errorCode } }); 
      } 
     } 
    } 

    base.OnAuthorization(filterContext); 

} 

[MainAuthorizationFilter] 
public ActionResult CreateFolder(...) 
{ 
    CreateFolder(...); 
} 
+1

301 przeniesiony na stałe nie ma sensu tutaj - 401 niedozwolone byłoby dużo bardziej sensowne;) – Jon

+0

@jon sry, 401 oczywiście –

Odpowiedz

10
filterContext.Result = new HttpStatusCodeResult(401, "String description here if you want"); 

HttpStatusCodeResult on MSDN

pamiętać, że fo moduł rms auth może przechwycić to i przekonwertować go na przekierowanie na twoją stronę logowania - nie wiem, czy to dotyczy również żądań AJAX, nie próbowałem tego ...

+0

To jest prawdopodobnie lepsze – Richard

+0

@ jon to działa dobrze, thx –

2

Chciałbym po prostu zakończyć reakcję jak w przykładzie:

public class MainAuthorizationFilter : AuthorizeAttribute 
{ 
    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     ... [my Authorization login] ... 

     if([Authorization fail]) 
     { 
      if (filterContext.HttpContext.Request.IsAjaxRequest()) 
      { 
       filterContext.HttpContext.Response.StatusCode = 403; 
       filterContext.HttpContext.Response.End(); 

      } 
      else 
      { 
        // In non-ajax request I just redirect me request and action/contoller isn't executed 
        filterContext.Result = new RedirectToRouteResult("Error", new RouteValueDictionary { { "errorCode", errorCode } }); 
      } 
     } 
    } 

    base.OnAuthorization(filterContext); 

} 
+0

Rozgłaszanie, ponieważ Response.End() zapobiega problemom z przekierowaniem powodowanym przez auth formularza, jak podano w innej odpowiedzi. – Nenotlep

+1

@Nenotlep - Niestety, nadal wykonuje kod w akcji, która ma wokół niego uwierzytelnianie. –

+0

@ Ek0nomik czy kiedykolwiek to zadziałało? – Todilo

Powiązane problemy