2010-05-20 27 views
5

Đây là bài đăng đầu tiên của tôi ở đây, vì vậy xin chào :) Được rồi, chúng ta hãy đến điểm ... Tôi đang viết ứng dụng đầu tiên của mình trong ASP.NET MVC Framework và i có vấn đề với việc kiểm tra các đặc quyền để sử dụng các cá thể của các lớp mô hình (đọc, chỉnh sửa). Mẫu mã trông như thế này:ASP.NET MVC ủy quyền và cho phép sử dụng các lớp mô hình

// Controller action 

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (!user.IsCurrentSessionUserOwned) 
     return View("NotAuthorized"); 

    return View(user); 
} 

Cho đến nay ủy quyền cho thuộc tính chỉ bảo vệ hành động điều khiển, vì vậy câu hỏi của tôi là: làm thế nào để làm cho CustomAuthorize thuộc tính để kiểm tra không chỉ vai trò người dùng, tên người dùng mà còn làm nguồn tức là thuyết minh trong các phương pháp hành động (Ở trên: Lớp người dùng, nhưng có các lớp ORQ LINQ2SQL khác như Tin tức, Hình ảnh, vv) Tất cả các đối tượng này đều có ID duy nhất, vì vậy thực thể người dùng có ID riêng, Tin tức có trường ID và trường UserID được tham chiếu tới bảng Người dùng. Làm thế nào tôi nên giải quyết vấn đề đó?

Trả lời

1

Nếu tôi hiểu đúng, bạn muốn cho phép người dùng người viết Tin tức, bài viết để chỉnh sửa News hoặc bài viết của mình ngay cả khi ông doesnt có vai trò của "Quản trị" hoặc "Editor" ..

Vâng đó là một trong những khó khăn, giải pháp đơn giản sẽ là:

Hãy CustomAuthorize của bạn vì nó là, NHƯNG để cho nó tiếp tục hành động, thay vì trả lại một Xem lỗi hoặc một cái gì đó chỉ tiêm một tham số hành động ví dụ:

CustomAuthorize:

//..Your Role Validation Logic Here... 
    if (filterContext.ActionParameters.Keys.Contains("isAuthorize")) 
     { 
     filterContext.ActionParameters.Remove("isAuthorize"); 
     } 
    filterContext.ActionParameters.Add("isAuthorize", isAuthorized); 

Vị trí được phép ẩn sẽ giữ kết quả của logic xác thực vai trò.

Vì vậy, trong điều khiển của bạn, bạn phải thêm một tham số thứ 2:

[CustomAuthorize(Roles="Editor, Admin")] 
public ActionResult Stats(int id, bool isAuthorized) 
{ 
    User user = userRepository.GetUser(id); 

    if (user == null || !user.Activated || user.Removed) 
     return View("NotFound"); 
    else if (user.Id != CurrentUser.Id && !isAuthorized) 
      //not Authorized by roles 
      //not the owner get away from here =D 
     return View("NotAuthorized"); 

    return View(user); 
} 

Tôi giả sử bạn có quyền truy cập vào một CurrentUser mà đến từ một tài sản trong BaseController (abstrac lớp).

Thực hiện điều gì đó phức tạp hơn điều đó sẽ dẫn đến tình huống phức tạp.

Ví dụ bạn có thể, nhưng không được khuyến khích:

A. Gửi userID của chủ sở hữu như một tham số (như vậy mỗi lần bạn gửi một ID trên url GET hoặc POST yêu cầu bạn phải thêm ID người dùng của chủ sở hữu dưới dạng tham số). Nhưng điều này có thể dẫn đến lỗi bảo mật thực sự xấu xí, bởi vì bạn phụ thuộc vào userID được gửi bằng dây có thể bị giả mạo bởi người dùng và woala! im được ủy quyền ngay bây giờ. B. Hãy thử dụ đối tượng trong bộ lọc hành động (nhưng bạn phải tìm ra thực thể đầu tiên bạn đang cố gắng, điều này có thể dẫn đến câu lệnh chuyển đổi dài và tham số thứ 3 trong CustomAuthorize để bạn biết thực thể nào để lấy từ DB).

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