この問題を解決するためにインターネットを検索しています。AD LDS(ADAM)ChangePassword over SSL
私は、ユーザーがASP.NET Webアプリケーションを使用してパスワードを変更できるようにする必要があるプロジェクトに取り組んでいます。
私はパスワードの履歴を適用し、LDSのユーザーに必要以上の権限を与えないため、 "ChangePassword"ではなく "SetPassword"を使用する必要があります。私は開発環境でこの作業を完了しようとしています。私は2台のマシン "Server1"(LDS、PingFederate、CA)と "Server2"(IIS)を持っています。私は2つのボックスの間にSSLをセットアップしていなかったので問題が発生している可能性があると思っていたので、昨日半日CAをセットアップして両方のマシンの証明書を作成しました。私はエラーログに何もエラーがなくなってから動作していると確信しています。ポート636でSSLをチェックしてLDPを使用してLDSにログインできます。私はまた、これらのマシンがドメイン環境にないことに言及する必要があります。テストネットワーク上のすべてのマシンでhostsファイルを編集しました。
Iは、コードの異なるバリエーションを試みた:
public static bool ChangePassword(string email, string pwd, string newPwd)
{
DirectoryEntry user = GetCN(email);
string username = user.Properties["cn"][0].ToString();
DirectoryEntry de = new DirectoryEntry();
de.AuthenticationType = AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer;
de.Path = user.Path;
de.Username = username;
de.Password = pwd;
try
{
Object obj = de.NativeObject;
de.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingSsl;
de.Options.PasswordPort = Convert.ToInt32(ConfigurationManager.AppSettings["LDAPPort_ExternalUsers"]);
de.Invoke("ChangePassword", new object[] { pwd, newPwd });
de.CommitChanges();
return true;
}
catch (Exception ex)
{
return false;
}
}
public static bool ChangePassword(string email, string pwd, string newPwd)
{
DirectoryEntry user = GetCN(email);
string username = user.Properties["cn"][0].ToString();
DirectoryEntry de = new DirectoryEntry(user.Path, username, pwd, AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer);
try
{
de.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingSsl;
de.Options.PasswordPort = Convert.ToInt32(ConfigurationManager.AppSettings["LDAPPort_ExternalUsers"]);
de.Invoke("ChangePassword", new object[] { pwd, newPwd });
return true;
}
catch (Exception ex)
{
return false;
}
}
public static bool ChangePassword(string email, string pwd, string newPwd)
{
DirectoryEntry userInc = GetCN(email);
string username = userInc.Properties["cn"][0].ToString();
using (DirectoryEntry searchRoot = new DirectoryEntry(ConfigurationManager.AppSettings["LDAPConnectionString_ExternalUsers"], username, pwd, AuthenticationTypes.SecureSocketsLayer | AuthenticationTypes.Secure))
using (DirectorySearcher ds = new DirectorySearcher(searchRoot))
{
ds.Filter = "(|(objectCategory=user)(cn=" + username + "))";
SearchResult sr = ds.FindOne();
if (sr != null)
{
using (DirectoryEntry user = sr.GetDirectoryEntry())
{
user.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingClear;
user.Options.PasswordPort = Convert.ToInt32(ConfigurationManager.AppSettings["LDAPPort_ExternalUsers"]);
//user.Invoke("SetOption", new object[] { 6, Convert.ToInt32(ConfigurationManager.AppSettings["LDAPPort_ExternalUsers"]) });
//user.Invoke("SetOption", new object[] { 7, 1 });
user.Invoke("ChangePassword", new object[] { pwd, newPwd });
}
return true;
}
}
return false;
}
IがオブジェクトOBJ = de.NativeObjectにおける最初のバージョンに例外を取得;.私はバインドが正しく起こっているかどうかを判断するためにこれを使用していました。これはデバッグのステップとして挿入されました。これはポート389を介してユーザーを認証する方法です。例外は「ログオン失敗:不明なユーザー名またはパスワードが間違っています。
de.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingSslで2番目のバージョンの例外が発生しました。例外は「ログオン失敗:不明なユーザー名または不正なパスワード」です。
SearchResult sr = ds.FindOne()で3番目のバージョンの例外が発生しました。例外は「ログオン失敗:不明なユーザー名または不正なパスワード」です。
AuthenticatioTypes.Noneでポート389でこのコードを実行しようとすると、 AuthenticationTypes.FastBind、de.Invoke( "ChangePassword"、新しいオブジェクト[] {pwd、newPwd})で失敗します。 「Unknown Name」は例外です。私は本当にこれをSSLの下で実行するか、少なくともクリアなパスワードを送信しないようにしたいと思います。 HTTPS経由でサイトを実行しています。私はLDS上のdsHeuristicsの値を変更して、SSL以外の接続でパスワードを変更できるようにしようとしましたが、それもうまくいきませんでした。
誰かが持っている可能性のある提案は、非常に高く評価されるでしょう。