2

Openldap supportedControl 一覧: 1.3.6.1.4.1.42.2.27.8.5.1 (パスワードポリシー)

.Net DirectoryServices.Protocols を使用して、このコントロールによって提供される応答情報を取得するために考えられるすべての方法を使い果たしました。

Cygwin環境でローカルにビルド/実行されている最新のOpenldapソースを使用しており、ビルドですべてのPPolicy関連の構成が有効になっており、PPolicyが構成され、動作/テストされています。

ディレクトリ サービス プログラミング ガイドの例を変更して、リンク: http://dunnry.com/blog/2006/05/11/DotNetDevGuideToDirectoryServicesCompanionSiteLaunched.aspx

を要求するように構成された DirectoryControl が入力された SearchRequest を使用するには、

パスワードポリシー、何も得られません。サーバーソースですべてがうまく見えます: http://www.openldap.org/devel/gitweb.cgi?p=openldap.git;a=blob_plain;f=servers/slapd/overlays/ppolicy.c;hb=HEAD

SearchRequest で .Net DirectoryControls を使用して運が良かった人はいますか?

ここに私が試してきたいくつかのコードがあります:

    _authConnect.AuthType = AuthType.Basic;
// credentials.UserName is a user DN format, w/password and null domain
_authConnect.Credential = credentials;
Debug.WriteLine("PV: " + _authConnect.SessionOptions.ProtocolVersion);

var sr = //new ExtendedRequest();
         new SearchRequest(credentials.UserName, "(objectclass=*)", SearchScope.Base, null);
         //new DsmlAuthRequest(credentials.UserName);
        var isCritical = false;
    var ppolicy = "1.3.6.1.4.1.42.2.27.8.5.1";
        // ppolicy request and response control is referred to by the same OID
        sr.Controls.Add(new DirectoryControl(ppolicy, null, isCritical, true));
    sr.Controls.Add(new DirectoryControl(ppolicy, new byte[8], isCritical, false));

try
{
  var response = (SearchResponse)_authConnect.SendRequest(sr);
  DirectoryControl[] c = response.Controls;
  if (c.Rank > 0 && c.GetLength(0) > 0)
  {
     Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue());
  }
  SearchResultEntry entry = response.Entries[0];
  c = entry.Controls;
  if (c.Rank > 0 && c.GetLength(0) > 0)
  {
     Debug.WriteLine(c[0].Type + " value: " + c[0].GetValue());
  }  
  return true;
}
catch (LdapException ex)
{
  Debug.WriteLine(ex.Message);
}
4

1 に答える 1

0

私はあなたと同じ問題を抱えていて、多くのことを試みて失敗し、時間切れになりました。私が気付いた問題は、openldap がバインド要求でパスワードの有効期限情報のみを送信していたことです。サーバーですべてのログを有効にすることで、これを見つけました。そこで、バインド要求でディレクトリ コントロールを使用する方法を見つけようとしました。私が見つけた S.DS.P LdapConnection クラスを使用してそれを行う方法はありませんでした。次に、接続オブジェクトに反映し、ldaphandle 変数を取得して、ハッキングを行いました。これで、S.DS.P のように直接 c-api を呼び出すことができました。openldap のソースを調べたところ、そのツールは sasl バインド メカニズムを使用しており、そのライブラリではコントロールとの単純なバインドに頼るメカニズムがないことに気付きました。winldap では同じようには機能しません。これを行うと、不正なパラメーター応答コードが返されます。私が最後に試みたのは、ldap_bind の非同期バージョンを呼び出して、メッセージを読み返すことでした。残念ながら、応答にコントロールはありませんでした。私はそれらを送信していなかったので、openldap ログ ファイルが警告を設定していると述べていたにもかかわらず、返されなかったと思います。それが、組み込みの winldap bind メソッドのいずれかを使用する私の唯一の希望でした。

私が最後に試みるつもりだったが時間切れになったのは、コントロールを使用して独自のバインド メッセージを作成し、ldap_extended_operation_s 関数を使用してそれらをサーバーに送信することでした。 http://msdn.microsoft.com/en-us/library/aa366580(v=VS.85).aspx このプロジェクトにもう少し時間があれば、戻って試してみるかもしれません。もしそうなら、私はここで報告します。最終的には、これが解決策である場合は、Novell の ldapcsharp ライブラリを使用する方が簡単かもしれません。それを使用してサーバーコントロールでバインドリクエストを送信できるようです。私は winldap api だけを調べました。私はそれにある程度慣れており、すでに DirectoryServices.Protocols の使用にかなり慣れているからです。

于 2011-08-05T20:35:30.057 に答える