2011-01-12 27 views
5

Có điều gì đó trong các vai trò mà tôi không chính xác nhận được. sử dụng [Authorize] thuộc tínhThuộc tính ủy quyền theo thứ tự MVC, ưu tiên và câu hỏi chức năng

Khi bạn có [Authorize] thuộc tính trên bộ điều khiển và hành động trên:

  1. Khi một vai trò là trong cả hai, vai trò này sẽ có quyền truy cập
  2. Khi một vai trò duy nhất là được xác định tại Bộ điều khiển, nhưng không phải tại Hành động, không truy cập
  3. Khi vai trò chỉ được xác định tại Hành động, nhưng không được xác định tại Bộ điều khiển, không truy cập

Tôi hiểu điều đó, đó là hợp lý. Bạn cần truy cập vào bộ điều khiển trước khi bạn có thể chạy một hành động.

Những gì tôi không nhận được là tại sao làm việc này:

[Authorize(Roles = "Algemeen Beheer, Admin, Coordinator, Secretariaat")] 
public class FacturatieGegevensController : Controller { 

    [Authorize(Users = "Stefan.coordinator", Roles = "Algemeen Beheer, Admin")] 
    public ActionResult Create(int instID) { 

     return View(); 
    } 

} 

Khi tôi đăng nhập như người dùng Stefan.coordinator trong đó có vai trò coordinator, tôi thể truy cập bộ điều khiển, nhưng tôi không thể truy cập vào Create Hoạt động. Tôi nghĩ đây sẽ là mối quan hệ OR giữa UsersRoles. Không phải nó? và làm cách nào để làm việc này?

Trả lời

7

Điều kiện để truy cập Tạo phương pháp là:

((VAI TRÒ trong {Algemeen Beheer, quản lý, Điều phối viên, Secretariaat})) [từ bộ điều khiển cấp] VÀ ((USER trong {Stefan.coordinator}) VÀ (VAI TRÒ trong {Algemeen Beheer, Admin})) [từ phương pháp cấp]

Khi tất cả các AND/ORS đã được làm việc ra, điều này dẫn đến đơn giản:

USER trong {} Stefan.coordinator VÀ VAI TRÒ trong {Algemeen Beheer, Admin}

Đó là, trong vòng một AuthorizeAttribute Đặc biệt, người sử dụng và vai trò đang ANDed với nhau. Và trên nhiều AuthorizeAttributes, các điều kiện được AND cùng nhau.

Cách tốt nhất để nghĩ về điều này là các thuộc tính [Ủy quyền] không nhận thức được nhau, do đó, mỗi thực thi độc lập. Bộ điều khiển cấp một đi trước, sau đó một mức độ phương pháp đi. Để có được quyền truy cập vào phương thức, bạn cần phải vượt qua tất cả các cổng.

Chỉnh sửa - đã có câu hỏi về cách logic hoạt động như trên.

Lết:

A = ROLE is "Algemeen Beheer" 
B = ROLE is "Admin" 
C = ROLE is "Coordinator" 
D = ROLE is "Secretariaat" 
E = USER is "Stefan.coordinator" 

Kể từ bộ điều khiển cấp [Duyệt] thuộc tính là (A || B || C || D), phương pháp cấp [Duyệt] thuộc tính là (E & & (A || B)) và nhiều thuộc tính [Ủy quyền] được biểu diễn bằng một lôgic AND, logic kết thúc bằng (A || B || C || D) & & (E & & (A || B)) , giảm xuống thành E & & (A || B), yêu cầu người dùng phải đặt tên là "Stefan.coordinator" nằm trong vai trò "Algemeen Beheer" hoặc "Quản trị". Vì người dùng Stefan.coordinator không thuộc một trong hai vai trò này, kiểm tra không thành công.

Để vấn đề cụ thể của bạn ..

Nếu bạn muốn áp dụng logic riêng của mình vào [Duyệt] thuộc tính kiểm tra, lớp AuthorizeAttribute và ghi đè lên các phương pháp AuthorizeCore. Bằng cách đó bạn có thể nói nếu (User == "Stefan.coordinator" || base.AuthorizeCore (...)) {...}.

+0

Có lẽ tôi không tuân theo logic của bạn, tại sao '((USER trong {Stefan.coordinator})' bị loại bỏ? –

+0

@Nathan - Tôi đã đăng một làm rõ. Vui lòng cho tôi biết nếu điều này trả lời câu hỏi của bạn! – Levi

+0

đó Có vẻ như là ((USER trong {Stefan.coordinator}) ** AND ** (ROLE trong {Algemeen Beheer, Admin})) [từ cấp độ phương pháp] vì không người dùng nào khác có thể truy cập Hành động khi có thẻ người dùng này – Stefanvds

-3

[Authorize] được chỉ định ở cấp bộ điều khiển là mặc định, được sử dụng khi không có [Authorize] được chỉ định cho phương pháp hành động riêng lẻ.

Cả hai không hoạt động cùng nhau và chỉ một người sẽ được thực thi.

Nếu bạn chỉ định cả người dùng và vai trò trong bộ lọc [Authorize], thì cả hai phải được thỏa mãn để cho phép truy cập vào phương pháp.

Do đó, nó là AND chứ không phải OR.

+5

[Chỉnh sửa nhận xét trước] Điều này không chính xác. Tất cả các thuộc tính [Authorize] (cả controller và method) đều được thực hiện. – Levi

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