2010-09-23 23 views
5

Tôi có một ứng dụng dựa chủ yếu vào ủy quyền của người dùng. Bên trong nó, tôi đang sử dụng IPrincipal.IsInRole() để kiểm tra xem người dùng đang ở trong nhóm đúng:IPrincipal.IsInRole() chỉ hoạt động khi tôi cắt bớt tên vai trò - tại sao?

IPrincipal principal = Thread.CurrentPrincipal; 
bool inRole = principal.IsInRole("mydomainname\some role with a long name"); 

này hoạt động tốt đối với hầu hết các phần, nhưng thất bại (trả về một kết quả không chính xác) nếu hiệu trưởng là một thể hiện của một WindowsPrincipal. Tôi đã tìm thấy rằng để làm cho nó hoạt động chính xác, tôi phải cắt ngắn tên của vai trò mà tôi vượt qua trong phải dài 32 ký tự (bao gồm tên miền và \):

IPrincipal principal = Thread.CurrentPrincipal; // <- returns a WindowsPrincipal 
bool inRole = principal.IsInRole("mydomainname\some role with a lo"); 

cắt bỏ các tên vai trò sau đó hoạt động chính xác. Tại sao? Đây có phải là vấn đề về lỗi/tính năng/tài liệu không? Tôi có một ý tưởng rằng nó có thể liên quan đến các miền Win2000, nhưng không thể tìm thấy bất kỳ thông tin nào về nó.

Một số thông tin thêm:
Đây là một vấn đề bởi vì các ứng dụng có thể được cấu hình để sử dụng hoặc thư mục hoạt động hoặc "tùy chỉnh" cho phép của nó ("tùy chỉnh" là bất kỳ nhà cung cấp uỷ quyền có hỗ trợ một giao diện - có thể là SQL dựa trên, dựa trên tệp, v.v.). Khi tùy chỉnh được định cấu hình, các vai trò có khả năng nhất không cần cắt xén và vì vậy tôi không muốn phải xử lý trường hợp đặc biệt này trong mã của tôi. Ngoài ra, tôi có một phần khác của ứng dụng sử dụng các lớp trong không gian tên System.DirectoryServices.AccountManagement để tra cứu các thành viên nhóm. Điều này yêu cầu tên vai trò đầy đủ và không hoạt động nếu chúng bị cắt bớt.

+4

Ai đó từng nghĩ: "32 ký tự đủ cho bất kỳ vai trò nào" –

+0

@Henk: Tôi thích nó :) Các ký tự là 32 làm cho nó khó tìm kiếm khi bạn nhận được nhiều lần truy cập cho 'Int32',' Win32' , v.v ... – adrianbanks

Trả lời

7

Sau nhiều lần thử và sai, tôi đã tìm ra những gì đang diễn ra.

Khi một nhóm được tạo ra trong Active Directory, nó được đưa ra hai tên:

alt text

Nó có vẻ là rằng WindowsPrincipal sử dụng tên nhóm pre-Windows 2000 khi IsInRole được gọi.

Sau khi tìm kiếm rộng rãi, điều này dường như không được ghi lại ở bất cứ đâu. Gần nhất tôi nhận được là this speculative answer cho một câu hỏi tương tự ở đây trên SO.


Trong trường hợp của tôi, nhóm tôi đã truy vấn trên tên miền có tên dài, nhưng tên trước Windows 2000 bị cắt ngắn (cắt ngắn thành 32 ký tự vì một lý do nào đó). Việc chuyển vào tên dài không hoạt động vì nó đang kiểm tra tên nhóm sai.

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