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.
Ai đó từng nghĩ: "32 ký tự đủ cho bất kỳ vai trò nào" –
@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