2008-12-22 22 views
7

Tôi đang cố gắng sử dụng thư viện được Novell phát hành (Novell.Directory.Ldap). Phiên bản 2.1.10.Novell LDAP C# - Novell.Directory.Ldap - Có ai đã làm cho nó hoạt động không?

Những gì tôi đã làm như vậy cho đến nay:

  • Tôi đã thử nghiệm kết nối với một ứng dụng (LdapBrowser) và nó làm việc, vì vậy không phải là một vấn đề thông tin liên lạc của nó.

  • Nó được biên dịch trong Mono, nhưng tôi đang làm việc với Visual Studio. Vì vậy, tạo ra một dự án với các nguồn. Tôi cũng bao gồm một tham chiếu đến Mono.Security, bởi vì dự án phụ thuộc vào nó.

  • Tôi đã nhận xét một cuộc gọi (freeWriteSemaphore (semId);) trong lỗi bắt một phần của kết nối, bởi vì nó đã ném nhiều ngoại lệ hơn. Tôi đã kiểm tra những gì mà cuộc gọi đã làm, và nó chỉ là một cơ chế truy tìm lỗi.

  • Tôi đã làm theo các bước cơ bản được cung cấp trong tài liệu của Novell (http://www.novell.com/coolsolutions/feature/11204.html).

    // Tạo một thể hiện LdapConnection

    LdapConnection ldapConn = new LdapConnection(); ldapConn.SecureSocketLayer = ldapPort == 636;

    // Kết nối chức năng sẽ tạo ra một kết nối ổ cắm với máy chủ

    ldapConn.Connect (ldapHost, ldapPort);

    // chức năng Bind sẽ Bind Credentials đối tượng người dùng với máy chủ

    ldapConn.Bind (userDN, userPasswd);

  • Hiện tại, tính năng này đang gặp sự cố tại hàm Bind(). Tôi gặp lỗi 91.

Vì vậy, có ai đó từng sử dụng thư viện này và thấy nó hoạt động không? Nếu vậy, bạn đã làm gì để làm cho nó hoạt động, có một số cấu hình đặc biệt cần thiết không? Có cách nào để làm cho nó hoạt động trong môi trường .NET mà không có Mono (Tôi có thể có tham chiếu đến Mono dlls, nhưng tôi không muốn nó được cài đặt trên máy chủ)?

(CẬP NHẬT) Kết nối nằm trên cổng 636, do đó sử dụng SSL. Tôi đã kiểm tra với WireShark thông tin liên lạc và so sánh với những gì tôi nhận được từ Trình duyệt LDAP. Tôi đã thấy rằng bước mà SSL certicate được truyền đạt, không được thực hiện bởi thư viện LDAP. Vì vậy, cách tốt nhất để làm cho nó làm những gì nó phải?

(CẬP NHẬT) Tôi đã kiểm tra tài liệu và cho biết tài liệu không hỗ trợ SSL. http://www.novell.com/coolsolutions/feature/11204.html

Xác thực với máy chủ LDAP bằng LdapConnection.Bind(). Chúng tôi chỉ hỗ trợ xác thực bằng văn bản. Hỗ trợ SSL/TLS chưa được thêm.

Nhưng ngày tài liệu từ năm 2004 và kể từ đó, nhiều cập nhật đã được thực hiện. Và có một tham số trong thư viện để xác định xem kết nối có sử dụng SSL hay không. Vì vậy, bây giờ tôi đang bối rối.

(CẬP NHẬT) Tìm thấy tài liệu cập nhật hơn: http://developer.novell.com/documentation//ldapcsharp/index.html?page=/documentation//ldapcsharp/cnet/data/bqwa5p0.html. Cách kết nối SSL được thực hiện, là bằng cách đăng ký chứng chỉ trên máy chủ. Vấn đề là những gì tôi đang làm không bị ràng buộc với một máy chủ Novell cụ thể, vì vậy chứng chỉ phải được lấy động.

+0

Cách thông thường để làm việc SSL là lấy khóa công khai của CA vào tương đương với kho khóa Java (Thường là cây CA). Dunno những gì có nghĩa là trong C# mặc dù. Một khi bạn đã có nó thì tất cả các chứng chỉ máy chủ được ký bởi CA đó sẽ hoạt động. Vì vậy, bạn sẽ cần một cây cho mỗi cây. – geoffc

Trả lời

4

Cuối cùng tôi đã tìm được cách để thực hiện công việc này.

Thứ nhất, đề tài bài viết đã giúp tôi có được đi đúng hướng: http://directoryprogramming.net/forums/thread/788.aspx

Thứ hai, tôi nhận được một biên dịch dll của Novell LDAP Thư viện và sử dụng Mono.Security.Dll.

Giải pháp:

tôi đã thêm chức năng này vào mã

// This is the Callback handler - after "Binding" this is called 
     public bool MySSLHandler(Syscert.X509Certificate certificate, int[] certificateErrors) 
     { 

      X509Store store = null; 
      X509Stores stores = X509StoreManager.LocalMachine; 
      store = stores.TrustedRoot; 

      //Import the details of the certificate from the server. 

      X509Certificate x509 = null; 
      X509CertificateCollection coll = new X509CertificateCollection(); 
      byte[] data = certificate.GetRawCertData(); 
      if (data != null) 
       x509 = new X509Certificate(data); 

      //List the details of the Server 

      //if (bindCount == 1) 
      //{ 

      Response.Write("<b><u>CERTIFICATE DETAILS:</b></u> <br>"); 
      Response.Write(" Self Signed = " + x509.IsSelfSigned + " X.509 version=" + x509.Version + "<br>"); 
      Response.Write(" Serial Number: " + CryptoConvert.ToHex(x509.SerialNumber) + "<br>"); 
      Response.Write(" Issuer Name: " + x509.IssuerName.ToString() + "<br>"); 
      Response.Write(" Subject Name: " + x509.SubjectName.ToString() + "<br>"); 
      Response.Write(" Valid From: " + x509.ValidFrom.ToString() + "<br>"); 
      Response.Write(" Valid Until: " + x509.ValidUntil.ToString() + "<br>"); 
      Response.Write(" Unique Hash: " + CryptoConvert.ToHex(x509.Hash).ToString() + "<br>"); 
      // } 

      bHowToProceed = true; 
      if (bHowToProceed == true) 
      { 
       //Add the certificate to the store. This is \Documents and Settings\program data\.mono. . . 
       if (x509 != null) 
        coll.Add(x509); 
       store.Import(x509); 
       if (bindCount == 1) 
        removeFlag = true; 
      } 

      if (bHowToProceed == false) 
      { 
       //Remove the certificate added from the store. 

       if (removeFlag == true && bindCount > 1) 
       { 
        foreach (X509Certificate xt509 in store.Certificates) 
        { 
         if (CryptoConvert.ToHex(xt509.Hash) == CryptoConvert.ToHex(x509.Hash)) 
         { 
          store.Remove(x509); 
         } 
        } 
       } 
       Response.Write("SSL Bind Failed."); 
      } 
      return bHowToProceed; 
     } 

Và tôi sử dụng nó trong quá trình ràng buộc

// Create Connection 
       LdapConnection conn = new LdapConnection(); 
       conn.SecureSocketLayer = true; 
       Response.Write("Connecting to:" + ldapHost); 

       conn.UserDefinedServerCertValidationDelegate += new 
        CertificateValidationCallback(MySSLHandler); 

       if (bHowToProceed == false) 
        conn.Disconnect(); 
       if (bHowToProceed == true) 
       { 
        conn.Connect(ldapHost, ldapPort); 
        conn.Bind(loginDN, password); 
        Response.Write(" SSL Bind Successfull "); 

        conn.Disconnect(); 
       } 
       quit = false; 

Các yếu tố chính đang sử dụng SSL Handler để tự động có được chứng chỉ và sử dụng X509StoreManager.LocalMachine để khi trang web đang chạy có thể lưu và tìm nạp chứng chỉ.

+0

Điều này có vẻ như nó có thể hữu ích cho tôi, nhưng tôi không thể nói vì tôi không thể tìm thấy một máy chủ Novell đang chạy có thư viện. Bất kỳ cơ hội nào bạn có thể gửi email cho tôi? không hài lòng ở thư G – Fantius

2

91 là "không thể kết nối". Hãy thử đặt máy chủ ở định dạng "ldap: //x.x.x.x", kiểm tra xem userDN đã được đặt đúng chưa (với tên miền, v.v.).

Tôi thường sử dụng WireShark để xem điều gì đang diễn ra ở cấp độ mạng (nhận thức được giao thức LDAP).

2

Tôi nghĩ rằng tôi có thể đã cung cấp câu trả lời này cho người khác trong một câu hỏi khác.

[Câu hỏi khác trên LDAP] [1]

Hai vấn đề tôi nghĩ: 1) Bạn đang cố gắng loại ràng buộc nào? SSL? Xóa văn bản? Vô danh?

2) Làm cách nào để cấu hình ở phía eDirectory cho LDAP liên kết?

Công cụ Trình duyệt LDAP, bạn có đang đề cập đến công cụ tại liên kết này không? Trình duyệt LDAP miễn phí

Bên eDirectory, họ có thể yêu cầu TLS cho tất cả liên lạc LDAP và họ có thể không cho phép liên kết Ẩn danh.

Bạn có thể hỏi những người ở đầu kia để bật tính năng theo dõi LDAP hay không (sử dụng DStrace với tùy chọn + LDAP, một số liên kết về cách sử dụng Dstrace trên Novell eDirectory xem: Các loại Dstrace Chụp và hiểu DS Trace cho Identity Manager.)

Điều đó thường sẽ hiển thị thông báo lỗi sẽ soi sáng bạn.

Dự đoán của tôi là Yêu cầu TLS được bật và bạn có thể không thực hiện liên kết SSL thành công.

Nếu có, hãy thử kết nối trên cổng 636, với SSL được bật và DN đủ điều kiện cho người dùng bạn đang cố gắng đăng nhập.

Nếu bạn đang thử kích hoạt SSL và bạn không nhận được hộp bật lên về chấp nhận chứng chỉ gốc tin cậy của cây CA, thì có lẽ CA hoặc chứng chỉ SSL được gửi đến máy chủ eDirectory là người dùng đã hết hạn hoặc bị hỏng. (Có bất kỳ số nguyên nhân nào cho điều này có thể phổ biến và mất một chút thời gian để khắc phục).

Thông thường trong Dstrace bạn sẽ thấy lỗi về chứng chỉ SSL nếu có sự cố. Một ví dụ từ quan điểm của Trình quản lý danh tính của Novell về chứng chỉ hết hạn nằm trong bài viết này: Chứng chỉ đã hết hạn Cũng như một số chi tiết về cách sửa chứng chỉ.

Khả năng tiếp theo là DN bạn chỉ định không chính xác.

Hãy cho tôi biết nếu bạn cần thêm trợ giúp.

+0

Chúng tôi không thể thay đổi bất cứ điều gì trên máy chủ Novell, nó được quản lý bởi một nhóm khác và chạy trong một môi trường sống. Vì vậy, chúng tôi có một kết nối acces để kiểm tra xác thực với nó, nhưng đó là tất cả chúng ta có. Với trình duyệt LDAP, chúng tôi có thể kết nối với nó, do đó, vấn đề của nó là làm cho công việc DLL này. – ceetheman

+0

Bạn có chứng chỉ gốc cây trong kho khóa của mình không? (Không chắc chắn những gì tương đương C# được gọi). Nó không phải là máy chủ cụ thể, mỗi se. Nó là cây cụ thể hơn. I E. Một chứng chỉ CA gốc cho mỗi cây sẽ cho phép truy cập vào tất cả các máy chủ. – geoffc

1

Theo dõi bài đăng trước của tôi - nếu bạn phải sử dụng kết nối an toàn, hãy thử sử dụng ldaps: // làm tiền tố cho địa chỉ máy chủ.

Nếu không có hỗ trợ SSL/TLS, bạn có thể thử this - nguyên tắc và trình bao bọc .NET cho thư viện OpenLDAP.

Một điểm quan trọng - có cài đặt cho mức độ bảo mật TLS trong OpenLDAP, vì vậy nếu máy chủ LDAP của bạn có chứng chỉ tự ký, bạn phải nhập chứng chỉ đó ở phía máy khách hoặc đặt TLS để không kiểm tra quyền ký * ít an toàn hơn tất nhiên).

+0

Thêm ldaps: // làm cho địa chỉ không hợp lệ. Máy chủ sử dụng SSL và chứng chỉ được nhập ở phía máy khách. – ceetheman

+0

Và thư viện OpenLDAP được tạo bằng Visual Studio và không có phiên bản được biên dịch (phiên bản của nó từ trước năm 2004). – ceetheman

3

Tôi đã tìm kiếm giải pháp cho một vấn đề tương tự. Lệnh ràng buộc của tôi cũng sẽ thất bại trong khi sử dụng cùng một mã từ trang web của Novell. Giải pháp đã làm việc cho tôi là thêm lại Xác thực chứng chỉ động. Bạn có thể đọc về nó here.

 // Creating an LdapConnection instance 
     LdapConnection ldapConn = new LdapConnection(); 

     ldapConn.SecureSocketLayer = true; 

     ldapConn.UserDefinedServerCertValidationDelegate += new 
       CertificateValidationCallback(MySSLHandler); 


     //Connect function will create a socket connection to the server 
     ldapConn.Connect(ldapHost, ldapPort); 

     //Bind function will Bind the user object Credentials to the Server 
     ldapConn.Bind(userDN, userPasswd); 

     // Searches in the Marketing container and return all child entries just below this 
     //container i.e. Single level search 
     LdapSearchResults lsc = ldapConn.Search("ou=users,o=uga", 
          LdapConnection.SCOPE_SUB, 
          "objectClass=*", 
          null, 
          false); 

     while (lsc.hasMore()) 
     { 
      LdapEntry nextEntry = null; 
      try 
      { 
       nextEntry = lsc.next(); 
      } 
      catch (LdapException e) 
      { 
       Console.WriteLine("Error: " + e.LdapErrorMessage); 
       // Exception is thrown, go for next entry 
       continue; 
      } 
      Console.WriteLine("\n" + nextEntry.DN); 
      LdapAttributeSet attributeSet = nextEntry.getAttributeSet(); 
      System.Collections.IEnumerator ienum = attributeSet.GetEnumerator(); 
      while (ienum.MoveNext()) 
      { 
       LdapAttribute attribute = (LdapAttribute)ienum.Current; 
       string attributeName = attribute.Name; 
       string attributeVal = attribute.StringValue; 
       Console.WriteLine(attributeName + "value:" + attributeVal); 
      } 
     } 
     ldapConn.Disconnect(); 
     Console.ReadKey(); 
    } 

public static bool MySSLHandler(Syscert.X509Certificate certificate, 
      int[] certificateErrors) 
     { 

      X509Store store = null; 
      X509Stores stores = X509StoreManager.CurrentUser; 
      //string input; 
      store = stores.TrustedRoot; 

      X509Certificate x509 = null; 
      X509CertificateCollection coll = new X509CertificateCollection(); 
      byte[] data = certificate.GetRawCertData(); 
      if (data != null) 
       x509 = new X509Certificate(data); 

      return true; 
     } 
1

Tôi làm việc trên tích hợp Trình quản lý danh tính trước mặt. Vì vậy, mã tôi viết luôn đến từ một vài khách hàng gọi điện. Điều này có thể không phù hợp nếu bạn đang cố gắng đóng gói một ứng dụng để sử dụng "ở bất kỳ đâu".

Tôi chỉ muốn cập nhật chuỗi này với giải pháp đơn giản cho các máy chủ Novell có tùy chọn bảo mật mặc định TLS/SSL "bắt buộc" được bật.

1) Đảm bảo bạn nhận được chứng chỉ SSL khỏi máy chủ Novell mà bạn đang ràng buộc và đăng ký những người đó vào cửa hàng đáng tin cậy trên máy khách/máy chủ thực thi. Thường có 2 cho IP và tên máy chủ phụ thuộc vào đó bạn sẽ gọi (DNS thích hợp hơn)

2) Nhập/thêm tài liệu tham khảo bằng cách sử dụng System.DirectoryServices; sử dụng System.DirectoryServices.Protocols;

3) Dưới đây là một đoạn trích. Đảm bảo bạn chọn AuthenticationTypes.SecureSocketsLayer là khóa.

// serverAddress = Server IP or DNS (Match SSL certificate) 
// ObjectDN = The DN of the user you are binding to 
// userName = Account which will be used to make the bind 
// password = password of the user which will make the bind 
// value = The value you wish to add to the attribute 

// Connect to the user in LDAP 
DirectoryEntry entry = new DirectoryEntry("LDAP://" + serverAddress + "/" + ObjectDN + "" 
       , userName 
       , password 
       , AuthenticationTypes.SecureSocketsLayer); 
// Write the Updated attribute 
entry.Properties["attribute"].Value = value; 
// Read back the updated Attribute into a label 
label.Text = entry.Properties["attribute"].Value.ToString(); 
Các vấn đề liên quan