7

Tôi có một kịch bản mà tôi chưa thể giải quyết:UrlHelper và ViewContext bên trong một thuộc tính ủy quyền

Tôi đang đùa giỡn với việc tạo thuộc tính ủy quyền tùy chỉnh của riêng mình cho mvc. Các bit chính của chức năng tôi muốn thêm là có khả năng thay đổi nơi người dùng được chuyển hướng nếu họ không có trong một vai trò nhất định. Tôi không ngại rằng hệ thống sẽ gửi chúng trở lại trang đăng nhập nếu chúng không được xác thực, nhưng tôi muốn chọn nơi gửi chúng nếu chúng được xác thực nhưng không được phép truy cập vào phương thức hành động đó.

Dưới đây là là những gì tôi muốn làm:

public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
     public string Action; 
     public string Controller; 

     protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
     { 
      // if User is authenticated but not in the correct role 
      string url = Url.Action(this.Action, this.Controller);     
      httpContext.Response.Redirect(url); 
     } 
    } 

Và như một tiền thưởng thêm Tôi muốn được tiếp cận với ViewContext và TempData trước khi tôi làm chuyển hướng.

Bất kỳ suy nghĩ nào về cách tôi có thể khởi tạo UrlHelper và ViewContext trong thuộc tính?

Trả lời

11

Bạn có thể ghi đè lên OnAuthorization phương pháp:

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    { 
     throw new ArgumentNullException("filterContext"); 
    } 

    // Call the AuthorizeCore which should return true or false 
    if (!this.AuthorizeCore(filterContext.HttpContext)) 
    { 
     filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary() 
     { 
      { "controller", "home" }, 
      { "action", "about" }, 
      { "id", "foo" }, 
     }); 
    } 
} 

Theo như ViewData và TempData lo ngại: filterContext.Controller.ViewDatafilterContext.Controller.TempData nên làm việc bên trong các phương pháp OnAuthorization. Và cuối cùng nếu bạn muốn sử dụng một UrlHelper (trong trường hợp này không cần vì RedirectToRouteResult là tốt hơn), bạn có thể nhanh chóng nó:

var urlHelper = new UrlHelper(filterContext.RequestContext); 
+1

Brilliant, thx. Sau khi nhìn vào phản ứng của bạn, tôi nhận ra rằng tôi có thể chỉ đơn giản là hỏi "Làm thế nào để tôi đi về nhận AuthorizationContext." Một khi tôi có tôi nguy hiểm. –

+0

Lưu ý: Việc thực hiện phương thức OnAuthorization() không phải là một bài tập tầm thường. Nếu bạn chọn ghi đè OnAuthorization() thay vì AuthorizeCore(), vui lòng thêm mã trong OnAuthorization() để vô hiệu hóa hoặc lưu bộ đệm đầu ra. Xem http://forums.asp.net/p/1533590/3737756.aspx để biết thêm thông tin. – Levi