2011-07-19 32 views
5

Làm thế nào tôi có thể ngăn chặn thực hiện hành động/điều khiển mà không cần chuyển hướng, và chỉ trả lại phản ứng với statusCodeASP.NET MVC3 Dừng thực hiện hành động/điều khiển trong tùy chỉnh 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 được chuyển vĩnh viễn không thực sự có ý nghĩa ở đây - 401 không được phép sẽ có ý nghĩa hơn nhiều;) – Jon

+0

@jon sry, 401 của khóa học –

Trả lời

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

HttpStatusCodeResult on MSDN

Lưu ý rằng fo Mô-đun auth rms có thể ngăn chặn điều này và chuyển đổi nó sang chuyển hướng đến trang đăng nhập của bạn - không chắc chắn nếu điều này cũng áp dụng cho các yêu cầu AJAX, tôi chưa thử ...

+0

Đây có lẽ là tốt hơn – Richard

+0

@jon công việc này tốt, thx –

2

Tôi chỉ đơn giản là sẽ kết thúc phản ứng như vậy:

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

Upvote vì Response.End() ngăn chặn các vấn đề chuyển hướng gây ra bởi các biểu mẫu auth như đã nêu trong câu trả lời khác. – Nenotlep

+1

@Nenotlep - Thật không may, nó tiếp tục thực thi mã trong Hành động có xác thực được bao quanh nó. –

+0

@ Ek0nomik bạn đã từng làm việc này chưa? – Todilo

Các vấn đề liên quan