2011-01-13 29 views
7

Tôi có một tình huống mà tôi đang sử dụng đoạn mã sau để xác minh thành viên sử dụng trong AD trước khi thực hiện nhiệm vụ trong ứng dụng của tôiphép người sử dụng Winform qua Active Directory

using System.Security.Principal; 
WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
WindowsPrincipal principal = new WindowsPrincipal(identity); 
return principal.IsInRole("someGroup"); 

Đoạn mã trên hoạt động tốt cho máy tính trên tên miền của tôi, tuy nhiên tôi có một số máy không nằm trong miền của mình mà tôi đã cài đặt ứng dụng WINFORM. Làm cách nào tôi có thể xác minh tư cách thành viên của người dùng trong AD?

Chỉnh sửa - có cách nào để nhắc đăng nhập cửa sổ không?

+0

Bạn có nghĩa là người dùng (và máy của bạn) đang chạy ứng dụng biểu mẫu của bạn đang ở trong một miền không đáng tin cậy khác hoặc hoàn toàn không nằm trong miền? Bạn có ý nghĩa gì đối với Đăng nhập Windows? Bạn thực sự có thể viết hộp thoại của riêng bạn để nhắc người dùng nhập tên người dùng và mật khẩu của mình. Sau đó, bạn sử dụng thông tin đăng nhập miền của mình để nói chuyện với Active Directory. –

+0

Đúng. một số máy không có trên miền. Tôi có thể tìm thông tin về thông tin đăng nhập qua hộp đăng nhập tùy chỉnh ở đâu? Tôi đã thử, tôi có thể xác thực nhưng không nhận được thông tin thành viên. Tôi đã theo dõi http://support.microsoft.com/kb/326340 –

+1

Bất kỳ nhận xét nào về câu trả lời được đề xuất của tôi? Nó làm việc cho bạn? –

Trả lời

7

Vì máy tính của bạn không tham gia vào miền, chúng tôi không thể sử dụng WindowsIdentity hoặc WindowsPrincipal và sau đó kiểm tra phương thức IsInRole() của nó. Phương thức IsInRole() chỉ hoạt động nếu máy tính của bạn được nối với miền và nó đang sử dụng tài khoản máy miền của bạn để làm S4USelf.

Bạn không thể sử dụng phương pháp LogonUser vì máy tính của bạn sẽ không cho phép bạn tạo phiên đăng nhập từ một khu rừng không tin cậy.

Tôi nghĩ rằng chúng tôi chỉ có thể truy vấn Active Directory trực tiếp để nhận thông tin chúng tôi muốn. Mã trong Microsoft KB đã đăng của bạn không hoạt động tốt như tôi có thể nói. Nó đang cố truy vấn từ thuộc tính memberOf. Thông tin nhóm không phải lúc nào cũng có sẵn từ các thuộc tính memberOf.

Tôi vừa viết một hàm IsInRole() bằng cách sử dụng AccountManagement. Tôi đoán đây là những gì bạn muốn. Hàm IsInRole() sẽ gọi hàm đệ quy IsInGroup() để tìm ra tất cả các nhóm người dùng thuộc về.

private bool IsInRole(string domain, string username, string password, string role) 
{ 
    using (var context = new PrincipalContext(ContextType.Domain, domain, username, password)) 
    { 
     GroupPrincipal group = GroupPrincipal.FindByIdentity(context, IdentityType.SamAccountName, role); 
     UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username); 
     return IsInGroup(user, group); 
    } 
} 

private bool IsInGroup(Principal principal, GroupPrincipal group) 
{ 
    if (principal.IsMemberOf(group)) 
     return true; 

    foreach (var g in principal.GetGroups()) 
    { 
     if (IsInGroup(g, group)) 
      return true; 
    } 

    return false; 
} 

Để sử dụng hàm IsInRole() này, bạn cần cung cấp tên miền và thông tin xác thực tên miền của mình. Nếu tên người dùng và mật khẩu được cung cấp sai, bạn sẽ nhận được một ngoại lệ.

Bạn cần .NET 3.5 SP1 để sử dụng API quản lý tài khoản. Ngoài ra, bạn có thể muốn chú ý đến điều này hotfix. API AccountManagement có một số lỗi nếu chạy trong một số môi trường. Bạn có thể cần phải áp dụng các hotfix.

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