2010-08-04 25 views
9

Tôi gặp sự cố khi sử dụng phương thức GetAuthorizationGroups của lớp UserPrincipal trong ứng dụng web.Lỗi với phương pháp UserPrincipal.GetAuthorizationGroups()

Sử dụng đoạn mã sau, tôi nhận được "Trong khi cố gắng để lấy các nhóm ủy quyền, một lỗi (5) xảy ra"

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM", "username", "password"); 
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); 
var groups = p.GetAuthorizationGroups(); 

Tôi tin rằng mã này làm việc đến một mức độ nào đó.

  • Khi tôi xem các đối tượng bối cảnh, tôi có thể nhìn thấy các máy chủ và tên người dùng/mật khẩu đã được giải quyết một cách chính xác trong đối tượng
  • Khi tôi xem các đối tượng p, tôi có thể xem chi tiết AD đã được dân cư như điện thoại không v.v.

Đây là dấu vết ngăn xếp từ lỗi.

[PrincipalOperationException: While trying to retrieve the authorization groups, an error (5) occurred.] 
    System.DirectoryServices.AccountManagement.AuthZSet..ctor(Byte[] userSid, NetCred credentials, ContextOptions contextOptions, String flatUserAuthority, StoreCtx userStoreCtx, Object userCtxBase) +317279 
    System.DirectoryServices.AccountManagement.ADStoreCtx.GetGroupsMemberOfAZ(Principal p) +441 
    System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroupsHelper() +78 
    System.DirectoryServices.AccountManagement.UserPrincipal.GetAuthorizationGroups() +11 

Bằng cách loại bỏ tên người dùng và mật khẩu chi tiết từ các nhà xây dựng PrincipalContext và thay đổi applicationpool (trong IIS7) để chạy như cùng một người dùng ([email protected]) - đoạn mã sau hoạt động.

PrincipalContext context = new PrincipalContext(ContextType.Domain, null, "DC=MyCompany,DC=COM"); 
UserPrincipal p = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, "joe.blogs"); 
var groups = p.GetAuthorizationGroups(); 

Tôi cần lấy mã trong ví dụ đầu tiên để làm việc - Tôi không muốn chạy nhóm ứng dụng dưới dạng người dùng miền chỉ để làm cho mã này hoạt động.

Trả lời

2

Lỗi 5 cho biết ERROR_ACCESS_DENIED, gợi ý vấn đề liên quan đến quyền. Điều đó nói rằng, các mã sau đây vừa làm việc cho tôi, chạy trên Windows 7 với các trang web chạy như hồ bơi ứng dụng mặc định:

Nội dung của "cơ thể" của trang .aspx:

<asp:GridView ID="GridView1" runat="server"> 
</asp:GridView> 

Mã-đằng sau :

protected void Page_Load(object sender, EventArgs e) 
{ 
    var Context = new PrincipalContext(ContextType.Domain, "logon_domain", "username", "password"); 
    var principal = UserPrincipal.FindByIdentity(Context, "user_to_query"); 
    var groups = principal.GetAuthorizationGroups(); 

    GridView1.DataSource = groups; 
    GridView1.DataBind(); 
} 

trong ví dụ của tôi logon_domain là trái của domain_name\username, chứ không phải là phong cách của đặc tả tên miền mà bạn muốn sử dụng. Giải pháp của tôi có thể hoặc có thể không hoạt động cho bạn. Nếu không, nó sẽ trỏ đến vấn đề quyền ở đâu đó.

+0

Cảm ơn Rob, tôi đã thử nhiều kết hợp trong hàm dựng PrincipalContext không may mắn. Tôi nghĩ nguyên nhân gốc rễ của vấn đề của tôi là biết các yêu cầu quyền của người dùng ứng dụng để gọi phương thức GetAuthorizationGroups(). Người dùng ứng dụng của tôi đã đọc tất cả các quyền thông tin đối với các đối tượng trong OU. Hiện tại tôi đang làm điều này một cách dài bằng cách đọc thuộc tính memberOf của người dùng. Đây chỉ là cấp độ đầu tiên và không đệ quy. –

+0

FWIW, tôi đã có một phiên bản làm việc, nơi tôi đã sử dụng 'var Context = new PrincipalContext (ContextType).Tên miền, "logon_domain"); ', do đó, bối cảnh hoàn toàn là một tên miền và cũng làm việc mà không có lỗi trong Win7/hồ bơi ứng dụng mặc định. Máy bạn đang chạy mã trên miền đã tham gia phải không? – Rob

+1

Có, đã tham gia vào một miền. nếu tôi sử dụng constructorContipalContext (ContextType.Domain, "logon_domain") với dịch vụ mạng (AppPool) nó không hoạt động. Nếu tôi thay đổi AppPool để chạy như cùng một người dùng như được sử dụng trong phương pháp PrincipalContext (ContextType.Domain, null, "DC = MyCompany, DC = COM", "tên người dùng", "mật khẩu") nó hoạt động! –

5

Tôi đã giải quyết vấn đề tương tự này. Xem thảo luận về câu hỏi tương tự. https://stackoverflow.com/a/8347817/2012977

Giải pháp là dưới đây:

public List<GroupPrincipal> GetGroups(string userName) 
    { 
     var result = new List<GroupPrincipal>(); 
     PrincipalContext ctx = GetContext(); /*function to get domain context*/ 
     UserPrincipal user = UserPrincipal.FindByIdentity(ctx, userName); 
     if (user != null) 
     { 
      PrincipalSearchResult<Principal> groups = user.GetAuthorizationGroups(); 

      var iterGroup = groups.GetEnumerator(); 
      using (iterGroup) 
      { 
       while (iterGroup.MoveNext()) 
       { 
        try 
        { 
         Principal p = iterGroup.Current; 
         result.Add((GroupPrincipal) p); 
        } 
        catch (PrincipalOperationException) 
        { 
         continue; 
        } 
       } 
      } 
     } 

     return result; 
    } 
0

Có cái nhìn quản trị tại các tài khoản AD cho người sử dụng mà trả về mã lỗi 5. Tôi chạy vào ngày hôm nay rằng và nó bật ra được một khung cảnh trên mà người dùng của tài khoản. Có một hộp kiểm kế thừa các thiết lập bảo mật chưa được kiểm tra (tất cả những người dùng khác đã được chọn). Điều này giải quyết nó cho tôi.

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