27

tôi sử dụng một AuthorizationFilter tùy chỉnh như sau:Nhận ActionName, ControllerName và AreaName và vượt qua nó trong ActionFilter Thuộc tính

public class ActionAuthorizeAttribute : AuthorizeAttribute { 

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) { 

     if(!httpContext.User.Identity.IsAuthenticated) 
      return false; 

     if(IsUserExcluded()) 
      return false; 
     else 
      return IsRoleAuthorize(httpContext); 
    } 
} 

tôi sử dụng bộ lọc này ở phía trên cùng của mỗi hành động tôi có, và để kiểm tra được ủy quyền, cần Tên Hành động, Tên Bộ điều khiển và Tên Khu vực. Vì vậy, có cách nào để có được tên này trong phương pháp AuthorizeCore() như sử dụng System.Web.HttpContextBase? nếu câu trả lời là Không thì làm sao tôi có thể nhận được tên này và vượt qua nó để thuộc tính, rõ ràng là tôi không muốn thêm mỗi tên bằng tay, thực sự cái gì đó như ViewContext.RouteData.Values["Controller"] trong bộ điều khiển:

[ActionAuthorize(actionName=Action, controller=ControllerName, area=AreaName)] 
public ActionResult Index() { 
    return View(); 
} 

Có ai có bất kỳ ý tưởng về nó?

Trả lời

71

Bạn có thể lấy chúng từ RouteData:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext) 
{ 
    var rd = httpContext.Request.RequestContext.RouteData; 
    string currentAction = rd.GetRequiredString("action"); 
    string currentController = rd.GetRequiredString("controller"); 
    string currentArea = rd.Values["area"] as string; 

    ... 

} 
+1

"Bạn có thể lấy chúng từ RouteData" Is not một câu trả lời hay. ** Bây giờ ** nó đã được chỉnh sửa, tôi sẽ trở lại. – gdoron

+11

Điều này có thể chỉ trong ASP.NET MVC 4, nhưng khu vực này được tìm thấy trong rd.DataTokens ["khu vực"]. –

+0

Bạn nên thay đổi dòng var rd = httpContext.Request.RequestContext.RouteData; tới var rd = HttpContext.Current.Request.RequestContext.RouteData; tốt hơn để sử dụng một tiêu chuẩn hơn một tham số :) –

1

khuôn mặt cùng một vấn đề chỉ là một khoảnh khắc trước và giải pháp của tôi là:

  1. Xác định 2 thuộc tính trong lớp ActionAuthorizeAttribute của bạn ví dụ

    public string ControllerName {get;set;} 
    public string ActionName {get;set;} 
    
  2. Trong khi chú thích hành động của bộ điều khiển chỉ định chúng, ví dụ:

    [ActionAuthorize(Roles="Admin", ContollerName="ControllerName",ActionName="ActionName")]** 
    public ActionResult Disable(int id) 
    { 
    ... 
    } 
    
0

Bắt khu vực này sẽ không hoạt động nếu bạn đang ở trên một bộ lọc tùy chỉnh tiếp theo sẽ làm việc để có được một khu vực

filterContext.RouteData.DataTokens["area"]