2013-06-24 34 views
16

Tôi đang gặp sự cố khi chỉ định hai thuộc tính ủy quyền riêng biệt trên phương thức lớp: người dùng được phép truy cập nếu một trong hai thuộc tính là đúng.Nhiều thuộc tính ủy quyền trên phương thức

Các Athorization lớp trông như thế này:

[AttributeUsage(AttributeTargets.All, AllowMultiple = true)] 
public class AuthAttribute : AuthorizeAttribute { 
. . . 

và hành động:

[Auth(Roles = AuthRole.SuperAdministrator)] 
[Auth(Roles = AuthRole.Administrator, Module = ModuleID.SomeModule)] 
public ActionResult Index() { 
    return View(GetIndexViewModel()); 
} 

Có cách nào để giải quyết này hay tôi cần phải suy nghĩ lại cách tiếp cận của tôi?

Điều này sẽ được chạy trong MVC2.

Trả lời

21

Nhiều trường hợp AuthorizeAttribute được xử lý bởi MVC như thể chúng được kết hợp với AND. Nếu bạn muốn một hành vi OR, bạn sẽ cần phải thực hiện logic của riêng bạn để kiểm tra. Tốt nhất nên triển khai AuthAttribute để thực hiện nhiều vai trò và thực hiện kiểm tra riêng với logic OR.

Một giải pháp khác là sử dụng tiêu chuẩn AuthorizeAttribute và thực hiện các tùy chỉnh IPrincipal rằng sẽ thực hiện bool IsInRole(string role) phương pháp để cung cấp 'OR' hành vi.

Một ví dụ là ở đây: https://stackoverflow.com/a/10754108/449906

+0

Nó sẽ có thể tạo ra một thuộc tính Authorization (tức ' public class MultipleAuthOrAttribute {') có thể lấy làm đầu vào một vài' AuthAttributes'? – adamse

+2

Bạn không thể tạo Thuộc tính nhận các phiên bản Thuộc tính khác. Hàm tạo thuộc tính lớp chỉ có thể chấp nhận các giá trị hợp lệ thời gian biên dịch/các kiểu nguyên thủy. Đó là lý do tại sao 'AuthorizeAttribute' nhận vai trò như một chuỗi. –

+1

Có thể ai đó cung cấp tham chiếu đến tài liệu chính thức hỗ trợ tuyên bố rằng nhiều cá thể 'AuthorizeAttribute' được xử lý dưới dạng logic' AND'. Trong các thử nghiệm của riêng tôi, có vẻ như thứ tự của các bộ lọc là quan trọng, với bộ lọc đầu tiên có thông báo cuối cùng về việc liệu xác thực có thành công hay không. –

19

Có một cách tốt hơn để làm điều này trong các phiên bản sau này của asp.net bạn có thể làm cả hai OR và AND trên vai trò. Điều này được thực hiện thông qua quy ước, liệt kê nhiều vai trò trong một ủy quyền duy nhất sẽ thực hiện một OR khi thêm nhiều thuộc tính ủy quyền sẽ thực hiện VÀ.

HOẶC dụ

[Authorize(Roles = "PowerUser,ControlPanelUser")] 

VÀ Ví dụ

[Authorize(Roles = "PowerUser")] 
[Authorize(Roles = "ControlPanelUser")] 

Bạn có thể tìm thêm thông tin về vấn đề này tại liên kết sau https://docs.microsoft.com/en-us/aspnet/core/security/authorization/roles

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