2012-12-21 29 views
7

Tôi phải phát triển một ứng dụng quản lý người dùng. Tôi cần phải ủy quyền cho người sử dụng ở mức dữ liệu Ví dụ:Cấp phép dữ liệu trong ASP.Net MVC 3

Lấy một ví dụ ngân hàng:

  1. Clients - Ex: BANK1, Bank2, Bank3, Bank4.
  2. Chi nhánh Nhà nước - Ex: Stat1, State2, State3, State4
  3. Chi nhánh Quận - Ex: Quận 1, District2, District3, District4
  4. thiết bị - Kiểm tra, Direct Debit, Thường vụ tự

Khi một người dùng đăng nhập, anh ta sẽ chỉ có thể thấy một số khách hàng, một số chi nhánh nhà nước, một số chi nhánh của quận phụ thuộc vào các chi nhánh, cơ sở vật chất, vv được giao cho anh ta trong ứng dụng quản lý người dùng. Những thay đổi này cho những người dùng khác nhau.

Xin vui lòng bất cứ ai có thể giúp tôi ra cho cấp độ ủy quyền này bất kỳ công cụ tiêu chuẩn có sẵn hoặc nếu không phải là những gì sẽ là mô hình db tốt cho điều này?

+0

gì bạn đang nói là cho phép tổ chức có trụ sở. AFAIK, không có bất kỳ công cụ có sẵn bởi vì nó sẽ là khó khăn để tạo ra một cái gì đó chung chung. –

Trả lời

5

Bạn cần phải thực hiện Authorization cơ chế của riêng bạn, bạn cần phải tạo một bảng điều khiển, nơi bạn lưu trữ các cấp độ truy cập của người dùng, (giả rất nhiều thứ) một cái gì đó như:

UserAuthorization (UserId, EntityId, EntityType) 

UserId: Reference đến người dùng.

EntityId: Id của phần tử bạn muốn cấp quyền truy cập.

EntityType: Loại yếu tố bạn muốn cấp quyền truy cập (Client, Nhà nước, huyện, sở)

+--------+----------+------------+ 
| UserId | EntityId | EntityType | 
+--------+----------+------------+ 
|  1 |  2 | CLIENT  | 
|  1 |  2 | STATE  | 
|  1 |  3 | DISTRICT | 
+--------+----------+------------+ 

Bạn có thể sử dụng và nên sử dụng một số nguyên đại diện cho EntityType, tôi đã viết nó như văn bản chỉ cho ví dụ.

1

Bạn có thể xem ClaimsPrincipal và sử dụng Ủy quyền dựa trên xác nhận quyền sở hữu. Trong .Net 4.5 WIF được tích hợp. Có thể xem tóm tắt tại đây http://msdn.microsoft.com/en-us/library/ms729851.aspx

Có thể bạn sẽ phải tạo danh sách kiểm soát truy cập xung quanh từng đối tượng trong hệ thống. Cuối cùng, bạn cần phải có một cách dễ dàng để xác định duy nhất thực thể mà tôi đã nghĩ bằng cách sử dụng GUID. Sau đó, yêu cầu một yêu cầu cho GUID đó. Bạn rõ ràng có thể trở nên phức tạp hơn và yêu cầu quyền đọc, ghi kiểu. Bạn có thể kết thúc với nhiều xác nhận quyền sở hữu nếu bạn cấp quyền truy cập trực tiếp cho mỗi thực thể.

Cuối cùng bạn có muốn xác định quyền truy cập trên các thực thể riêng lẻ không? Một số loại nhóm có thể tốt hơn? Nếu bạn có thể quản lý ngân hàng, bạn có thể quản lý tất cả các tiểu bang của mình, nếu bạn quản lý khu vực của mình, bạn quản lý tất cả các chi nhánh của quận, v.v.

Tôi muốn nhóm người dùng thành các nhóm và sau đó gán quyền truy cập cho các nhóm. Khi bạn quản lý các tệp trong NTFS, bạn hiếm khi thấy mình cấp quyền truy cập vào một tệp riêng lẻ.

Nếu bạn cấp quyền cho ai đó cho nhóm thực thể, hãy kiểm tra nhóm lần đầu tiên và nếu họ không có xác nhận quyền sở hữu đó thì hãy kiểm tra thực thể.

Có thể cần phải thực hiện một số nội dung tùy chỉnh với http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.aspx. Vượt qua trong Xác nhận quyền sở hữu mà bạn muốn Chỉnh sửa ngân hàng, v.v. sau đó nó sẽ kiểm tra xem bạn có quyền trên ngân hàng cụ thể đó hay không. Tôi nghĩ bạn phải làm logic cho ACL trong phương thức CheckAccess.

Cũng có một cái nhìn tại http://thinktecture.github.com/Thinktecture.IdentityModel.45/

tôi cũng tìm thấy bài http://leastprivilege.com/2012/06/24/approaches-to-server-side-authorization/ sau - đọc Luceros gợi ý ở cuối. Về cơ bản như trên

+0

Câu trả lời quá mơ hồ. Ông hy vọng sẽ cho phép truy cập vào các thực thể riêng lẻ. Và mặc dù tôi đã viết hàng tá đơn đăng ký tuyên bố, tôi không thể nghĩ ra một cách dễ dàng để mô hình hóa sự ủy quyền chi tiết như vậy với các tuyên bố. Nếu bạn có ý tưởng thông minh, vui lòng chỉ mở rộng câu trả lời của bạn với thông tin chi tiết hơn. –

+0

Không có thông tin nào về việc cấp phép cho cấp thực thể nói chung là dễ dàng. Nó sẽ yêu cầu công việc :) – GraemeMiller

+0

@GraemeMiller Tôi đồng ý ủy quyền cấp độ thực thể, bổ sung tính phức tạp cho thiết kế DB, bổ sung thêm các kết nối/truy vấn để biết các thành phần nào trong List/Edit/View, mã lưu trữ/linq/EF/Data Access của bạn một chút lộn xộn và chất béo, nhưng đó là cuộc sống của một nhà phát triển =) – JOBG

0

Cảm ơn bạn đã trả lời. Vui lòng tìm dữ liệu mẫu. Nó có thể lên đến ba/n-số cấp.

User1d UserName

USR1  John  
USR2  William 
USR3  Joseph 
USR4  Mathew 
USR5  George 

ClientId CLIENTNAME

CL1   Barclays 
CL2   LLoyds TSB 
CL3   Natwest 
CL4   Nationwide 
CL5   HSBC 

countryID CountryName

CON1  England 
CON2  Wales 
CON3  Scotland 
CON4  Northern Ireland 

countryID cityId CityName

CON1  CTY1  Liverpool 
CON1  CTY2  Waterloo 
CON1  CTY3  Piccadilly 
CON2  CTY4  Cardiff 
CON2  CTY5  Ammanford 
CON2  CTY6  Abergele 
CON3  CTY7  Glasgow 
CON3  CTY8  Edinburgh 
CON3  CTY9  Aberdeen 
CON4  CTY10  Belfast 
CON4  CTY11  Hannahstown 
CON4  CTY12  Springfield 
.210

countryID cityId BranchId BRANCHNAME

CON1  CTY1  BRC1  Branch1 
CON1  CTY1  BRC2  Branch2 
CON1  CTY1  BRC3  Branch3 
CON2  CTY4  BRC4  Branch4 
CON2  CTY4  BRC5  Branch5 
CON2  CTY4  BRC6  Branch6 

UserId ClientId countryID cityId BranchId

USR1  CL1   CON1  CTY1  BRC1   
USR1  CL1   CON1  CTY1  BRC2   
USR2  CL2   CON1  CTY1  BRC1 
USR2  CL2   CON1  CTY1  BRC2 
Các vấn đề liên quan