Вызов NetValidatePasswordPolicy из C# всегда возвращает пароль должен измениться

у нас есть MVC-приложения, которое использует Active Directory для аутентификации пользователей. Мы используем System.DirectoryServices и с помощью PricipalContext для проверки подлинности:

_principalContext.ValidateCredentials(userName, pass, ContextOptions.SimpleBind);

однако этот метод возвращает только bool, и мы хотим вернуть лучшие сообщения или даже перенаправить пользователя на экран сброса пароля для таких случаев, как:

  1. пользователь заблокирован из своей учетной записи.
  2. пароль пользователи истек.
  3. в пользователь должен изменить пароль при следующем входе.

поэтому, если пользователь не может войти в систему, мы вызываем NetValidatePasswordPolicy чтобы понять, почему пользователь не смог войти. Это, казалось, работает хорошо, но мы поняли, что этот метод только возвращается NET_API_STATUS.NERR_PasswordMustChange независимо от состояния пользователя Active Directory.

единственный пример, который я нашел с этой же проблемой, исходит из плагина Sublime Speech здесь. Код я использую это как следует:

var outputPointer = IntPtr.Zero;
var inputArgs = new NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG { PasswordMatched = false, UserAccountName = username };
inputArgs.ClearPassword = Marshal.StringToBSTR(password);

var inputPointer = IntPtr.Zero;
inputPointer = Marshal.AllocHGlobal(Marshal.SizeOf(inputArgs));
Marshal.StructureToPtr(inputArgs, inputPointer, false);

using (new ComImpersonator(adImpersonatingUserName, adImpersonatingDomainName, adImpersonatingPassword))
{
    var status = NetValidatePasswordPolicy(serverName, IntPtr.Zero, NET_VALIDATE_PASSWORD_TYPE.NetValidateAuthentication, inputPointer, ref outputPointer);

    if (status == NET_API_STATUS.NERR_Success)
    {
        var outputArgs = (NET_VALIDATE_OUTPUT_ARG)Marshal.PtrToStructure(outputPointer, typeof(NET_VALIDATE_OUTPUT_ARG));
        return outputArgs.ValidationStatus;
    }
    else
    {
       //fail
    }   
}

код всегда удается, так почему значение outputArgs.ValidationStatus тот же результат каждый раз, независимо от состояния пользователя Active Directory?

1 ответов


я разбью ответ на этот вопрос на три разных раздела:

  1. Текущая Проблема С Вашей Методологией
  2. проблемы с рекомендуемыми решениями как в интернете, так и в этой теме
  3. Решение

текущая проблема с вашей методологией.

NetValidatePasswordPolicy требуется InputArgs параметр для ввода указателя на структуру, и структура, которую вы передаете, зависит от the ValidationType вы проходите. В этом случае вы проходите NET_VALIDATE_PASSWORD_TYPE.NetValidateAuthentication, который требует InputArgs NET_VALIDATE_AUTHENTICATION_INPUT_ARG но вы передаете указатель на NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG.

кроме того, вы пытаетесь присвоить значение типа "currentPassword"NET_VALIDATE_PASSWORD_CHANGE_INPUT_ARG структура.

тем не менее, есть большая фундаментальная проблема использования NetValidatePasswordPolicy и то, что вы пытаетесь использовать эту функцию для проверки паролей в Active Directory, но это не то, что он используется для. NetValidatePasswordPolicy используется для того, чтобы приложения могли проверять базу данных проверки подлинности, предоставленную приложением.

там больше информации о NetValidatePasswordPolicy здесь.

проблемы с рекомендуемыми решениями как в интернете, так и в этой теме

различные статьи в интернете рекомендуют использовать