11

Có rất nhiều câu hỏi (và thông tin) về việc thiết lập tư cách thành viên asp.net, nhà cung cấp vai trò và những thứ tương tự. Dù bạn có nên sử dụng nền tảng tích hợp được cung cấp bởi microsoft hay vai trò mở rộng các lớp cơ sở và vai trò của riêng bạn.Cách xử lý tốt nhất quyền (không phải vai trò) trong tư cách thành viên asp.net, đặc biệt trong ASP.NET MVC

Tôi đã quyết định gia hạn các nhà cung cấp mặc định và triển khai tư cách thành viên và nhà cung cấp vai trò của riêng mình. Bây giờ câu hỏi của tôi, cụ thể là xung quanh xác thực vai trò.

Theo truyền thống, bạn sẽ tạo vai trò có thể như 'Người quản lý, Quản trị viên, Nhân viên, Người dùng siêu' hoặc bất kỳ thứ gì bạn có. Nhưng bạn nên làm gì với các quyền mà tôi coi là một hạt kiểm soát tốt hơn? Hãy để tôi xây dựng ...

Trong trang web asp.net mvc của tôi, tôi có các lĩnh vực khác nhau như quản trị, quản lý, nhắn tin, báo cáo, v.v. Tôi sẽ phân vai cho mỗi người như 'Quản trị viên', 'Người quản lý', ' Phóng viên 'vv Nếu không có vai trò thích hợp, bạn không thể truy cập vào khu vực đó của trang web. Vì vậy, tôi sẽ khóa toàn bộ bộ điều khiển với điều này ở cấp lớp.

Nhưng bây giờ lấy một khu vực làm ví dụ; nhắn tin và nói rằng tôi muốn có quyền hạn hạt tốt hơn cho CRUD; tạo tin nhắn, xem/đọc tin nhắn, chỉnh sửa tin nhắn, xóa tin nhắn, v.v.

Cuối cùng câu hỏi của tôi. Làm thế nào tốt nhất để thực hiện hạt kiểm soát tốt hơn này? Một cách tiếp cận tôi thấy (không chắc chắn nếu nó là một tốt), là chỉ cần tạo vai trò thành viên asp.net cho tất cả mọi thứ. Vì vậy, tôi có thể có ....

Messenger (vai trò cấp độ rộng), CreateMessage, ReadMessage, EditMessage, DeleteMessage.

Một mặt tôi muốn một số người dùng có thể đọc/xem tin nhắn. Nhưng không nhất thiết phải tạo hoặc xóa chúng. Các hành động điều khiển riêng lẻ có thể áp dụng các vai trò cụ thể.

Bạn có thấy bất kỳ vấn đề nào với phương pháp này không? Bạn có ý kiển nào tốt hơn không?

Solution So Far

tôi đã quyết định để tạo ra sơ đồ của riêng tôi và thực hiện các thành viên tùy chỉnh và các nhà cung cấp vai trò. Lược đồ của tôi bao gồm;

  • tài
  • UserProfile
  • Permission
  • PermissionAssignment
  • Vai trò
  • RoleAssignment

Đi được đi cho một hoặc hai ngày hôm sau nhưng sẽ cập nhật thêm thông tin khi Tôi có cơ hội.

Trả lời

5

Tôi nghĩ bạn nên quên các vai trò trong cơ chế cấp phép, thay vào đó hãy yêu cầu quyền (ở cuối vai trò là một sự cấp phép), vì vậy nếu bạn nhìn nó theo cách đó, thuộc tính Authorize của bạn nên yêu cầu một thực thể và hành động, không phải cho một vai trò cụ thể. Một cái gì đó như:

[Authorize(Entities.Message, Actions.Create)] 
public ActionResult CreateMessage() 

[Authorize(Entities.Message, Actions.Edit)] 
public ActionResult EditMessage() 

[Authorize(Entities.Message, Actions.View)] 
public ActionResult ViewMessage() 

Bằng cách đó vai trò của bạn làm những gì họ làm tốt nhất, thu thập quyền trừu tượng thay vì xác định cách truy cập không linh hoạt.

CHỈNH SỬA: Để xử lý các quy tắc cụ thể như quy định của David Robbins, Người quản lý A không được phép xóa thư được tạo bởi Người quản lý B, giả sử cả hai đều có quyền cần thiết để truy cập Hành động điều khiển này, chịu trách nhiệm kiểm tra loại quy tắc này và thậm chí nếu bạn cố kiểm tra ở cấp Action Filter, nó sẽ là một nỗi đau, vì vậy những gì bạn có thể làm là mở rộng ủy quyền xác thực cho ActionResult (tiêm một tham số hành động đang giữ kết quả xác thực), và để ActionResult đưa ra quyết định logic ở đó với tất cả các đối số tại chỗ.

This là một câu hỏi tương tự, không chính xác như trường hợp được chỉ ra ở đây, mà là điểm khởi đầu tốt để mở rộng Xác thực ủy quyền với thông số hành động.

+0

Có thể tiến xa hơn một chút và không chỉ nói "hành động này có được phép không?" nhưng để nói "hành động này có được phép đối với thực thể cụ thể này không?" ví dụ. tình hình David Robbins chỉ ra nơi quản lý A không được phép xóa các tin nhắn được tạo bởi Manager B? –

+0

rằng kịch bản cụ thể có thể được xử lý bởi Hành động nhưng logic thực tế của Ủy quyền và ActionResult sẽ thay đổi một chút, một nhiệm vụ liên quan trước đây cho thấy cách bạn có thể lưu trữ, http: //stackoverflow.com/questions/2872588/asp- net-mvc-authorization-permission-to-use-model-classes/2878159 # 2878159 – JOBG

+0

Cảm ơn Omar, tôi đã làm nhiều hơn một chút về việc này và sẽ cập nhật khi có thêm thông tin về nơi tôi đang ở. Chúc mừng. –

-1

Cũng như thêm [Authorize(Roles="Administrator")] v.v. phía trên bộ điều khiển của bạn. Bạn cũng có thể đặt thuộc tính mà trên Actions indiviual quá

+0

Tôi đã thực sự đề cập đến điều này trong câu hỏi của mình. "... Hành động của trình điều khiển riêng lẻ có thể áp dụng các vai trò cụ thể". –

2

đối với ví dụ CRUD của bạn Với, không được bạn thực sự nói về ủy quyền, và ủy quyền sẽ thay đổi giữa các vai trò thành viên "Người quản lý" và "Phóng viên"?Tôi nghĩ bạn cần phải tạo ra một cơ chế riêng biệt cho những hoạt động hạt mịn hơn nếu vai trò không phân biệt giữa sự cho phép đọc và viết giữa các thông điệp.

Nếu bạn tạo vai trò cho từng hành động - EditMessage, DeleteMessage - bạn sẽ làm gì trong trường hợp Người quản lý A KHÔNG thể xóa tin nhắn cho Người quản lý B?

+0

Xin chào David, Cảm ơn bạn đã nhập. "Tôi nghĩ bạn cần phải tạo ra một cơ chế riêng biệt cho những hoạt động hạt mịn hơn nếu vai trò không phân biệt giữa ủy quyền đọc và viết giữa các thư." Đây chính xác là điều tôi đang băn khoăn. Đối với kịch bản của bạn ... không chắc chắn. Điểm tốt mặc dù. Tôi không * nghĩ * đó sẽ là một vấn đề. Tôi chủ yếu nghĩ rằng một người quản lý cấp cao hơn sẽ có quyền truy cập đầy đủ vào một khu vực của trang web, trong khi họ có thể cung cấp quyền truy cập một phần (chỉ đọc?) Cho một nhân viên theo họ, v.v. So với vai trò chung, tôi chưa nhìn thấy quyền được thảo luận nhiều. –

+0

Tôi đã chạy vào cùng một kịch bản năm ngoái trên một dự án mà tôi có các vai trò như AgentManager và Agent, nhưng quy tắc ủy quyền chỉ có Agent David Robbins mới có thể xem các bản ghi của David Robbins, và AgentManager chỉ có thể xem các báo cáo trực tiếp của cô ấy. Tôi đã giải quyết vấn đề với một vài bảng trong SQL để biểu diễn các mối quan hệ giữa các Đại lý và Trình quản lý tác nhân và các bản ghi tương ứng của chúng. –

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