Я искал в интернете несколько дней, пытаясь решить эту проблему.
Я работаю над проектом, в котором у меня есть требование разрешить пользователю изменять свой пароль с помощью веб-приложения ASP.NET.
Я должен использовать «ChangePassword», а не «SetPassword», так как я должен применять историю паролей и не позволять пользователям в LDS больше привилегий, чем им нужно.Я пытаюсь выполнить эту задачу в среде разработчика.У меня есть две машины: «Сервер1» (LDS, PingFederate, CA) и «Сервер2» (IIS).Я подумал, что у меня могут возникнуть проблемы, потому что у меня не было настройки SSL между двумя полями, поэтому вчера я потратил полдня на настройку ЦС и создание сертификатов для обеих машин.Я вполне уверен, что это работает, так как я больше не вижу никаких ошибок в журнале ошибок, и я могу войти в LDS, используя LDP, используя порт 636 с проверенным SSL.Я должен также упомянуть, что эти машины не находятся в доменной среде.Я отредактировал файл hosts на всех машинах в тестовой сети.
Я пробовал разные варианты кода:
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;
}
Я получаю исключение для первой версии в Object obj = de.NativeObject ;.Я использовал это для определения правильности привязки и был вставлен в качестве шага отладки, поскольку именно так я аутентифицировал пользователя через порт 389. Исключением является «Ошибка входа: неизвестное имя пользователя или неверный пароль».
Я получаю исключение для второй версии по адресу de.Options.PasswordEncoding = PasswordEncodingMethod.PasswordEncodingSsl;Исключением является «Ошибка входа в систему: неизвестное имя пользователя или неверный пароль».
Я получаю исключение для третьей версии в SearchResult sr = ds.FindOne ();Исключение составляет «Ошибка входа в систему: неизвестное имя пользователя или неверный пароль».
Если я попытаюсь запустить этот код через порт 389 с AuthenticatioTypes.None |AuthenticationTypes.FastBind, произойдет сбой при de.Invoke («ChangePassword», new object [] {pwd, newPwd});за исключением «Неизвестное имя».Я бы очень хотел, чтобы это работало по SSL или, по крайней мере, не передавало пароли в открытом виде.У меня есть сайт, работающий по HTTPS.Я попытался изменить значение dsHeuristics в LDS, чтобы можно было изменять пароли через не-SSL-соединение, но это тоже не сработало.
Будем весьма благодарны за любые предложения, которые кто-либо может получить.