Как выполнить клиентскую проверку смены пароля в Active Directory

70
5

Моя цель проста: предварительно проверить новый пароль на стороне клиента (Javascript), так как начальная проверка пароля соответствует политике паролей домена/домена, чтобы не тратить ресурсы сервера на отклонение неверных паролей и быстрее реагировать на запросы пользователей.

Вопрос: Как я могу получить политику паролей пользователей из Active Directory?

Мне особенно нужно знать "формат" пароля, длину пароля, требования к заглавным и специальным символам и т.д. Окончательной проверкой, конечно же, будет сама Active Directory. Но сначала я хочу использовать Javascript для оптимизации производительности, и я почти уверен, что смогу управлять Javascript, если смогу просто получить требования к формату пароля для конкретного пользователя/подразделения на стороне С#/ASP.Net.

В настоящее время я застрял, пытаясь найти ЧТО текущая политика паролей для пользователя. Да, пользователь Alice может использовать политику домена паролей, но у Bob может быть другая политика паролей в его OU.

Этот сайт будет установлен в учреждении с тысячами пользователей; мы хотим свести к минимуму повторную проверку в Active Directory. Кроме того, наличие этого в Javascript может в конечном итоге помочь в соответствии со специальной публикацией NIST 800-63, в которой, среди прочего, требуется оперативная обратная связь с пользователями по поводу относительной надежности пароля. На данный момент я должен быть в состоянии заставить код работать на Windows 2008, 2008 R2 и 2012.

В настоящее время я могу изменить пароль в С#, и я могу получить ошибку, но это все или ничего, и не полезно для проверки на стороне клиента.

public static PasswordChangeResultsDTO ChangeUserPassword(PasswordChangeRequestDTO request)
{
try
{
bool isPasswordChanged = false;
SearchResult result = LdapHelper.GetUser(request.Username, request.OldPassword);

if (result != null)
{
using (DirectoryEntry userEntry = result.GetDirectoryEntry())
{
userEntry.Invoke("ChangePassword", new object[] {request.OldPassword, request.NewPassword});
userEntry.CommitChanges();
isPasswordChanged = true;
}
}

return new PasswordChangeResultsDTO {PasswordChanged = isPasswordChanged};
}
catch (COMException comException)
{
LoggingHelper.Instance.WriteException(comException);
string message = comException.ErrorCode == -2147022651
? "The password does not meet the password policy requirements"
: comException.Message;
return new PasswordChangeResultsDTO {PasswordChanged = false, Message = message};
}
catch (TargetInvocationException targetInvocationException)
{
LoggingHelper.Instance.WriteException(targetInvocationException);
string message;
if (targetInvocationException.InnerException != null)
{
var comException = targetInvocationException.InnerException as COMException;
if (comException != null)
{
message = comException.ErrorCode == -2147022651
? "The password does not meet the password policy requirements"
: comException.Message;
}
else
{
message = targetInvocationException.InnerException.Message;
}
}
else
{
message = targetInvocationException.Message;
}

return new PasswordChangeResultsDTO {PasswordChanged = false, Message = message};
}
catch (Exception ex)
{
string msgError = (null != ex.InnerException) ? ex.InnerException.Message : ex.Message;
string msgSource = (null != ex.InnerException) ? ex.InnerException.Source : ex.Source;
string msgStackTrace = (null != ex.InnerException) ? ex.InnerException.StackTrace : ex.StackTrace;
string msgOutput = String.Format(CultureInfo.InvariantCulture,
"Exception in {3} MSG[{0}] SOURCE[{1}] STACK[{2}]",
msgError, msgSource, msgStackTrace, MethodBase.GetCurrentMethod().Name);

LoggingHelper.Instance.Fatal(msgOutput);
throw;
}
}

спросил(а) 2019-03-19T23:57:00+03:00 1 год, 7 месяцев назад
1
Решение
57

Найти эту информацию на уровне домена легко. Выяснить, переопределены ли какие-либо групповые политики, сложно по умолчанию.

На уровне домена есть атрибуты в самом домене, которые управляют политикой паролей по умолчанию для домена. Вы можете привязать к самому домену (т.е. LDAP://domain.com) и прочитать эти атрибуты:

    minPwdLength: минимальная длина символа pwdHistoryLength: количество старых паролей, которые нельзя использовать повторно. pwdProperties: это битовый флаг, который может означать различные вещи, о которых вы можете прочитать в разделе "PasswordProperties" здесь. Скорее всего, он будет установлен в 1 (DOMAIN_PASSWORD_COMPLEX), что означает, что пароль должен содержать как минимум две буквы: заглавные, строчные и цифры.

Если вы хотите прочитать групповые политики, которые будут применяться к подразделению пользователя, то, похоже, нет библиотек .NET для этого. Вы должны прибегнуть к использованию неуправляемого кода. Существует пример здесь, который использует IGPMDomain интерфейс с С#, но вам придется адаптировать его, чтобы найти объект групповой политики для правого OU.

ответил(а) 2019-03-20T16:07:00+03:00 1 год, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема