Вызов NetValidatePasswordPolicy из C# всегда возвращает пароль должен измениться
у нас есть MVC-приложения, которое использует Active Directory для аутентификации пользователей. Мы используем System.DirectoryServices
и с помощью PricipalContext
для проверки подлинности:
_principalContext.ValidateCredentials(userName, pass, ContextOptions.SimpleBind);
однако этот метод возвращает только bool, и мы хотим вернуть лучшие сообщения или даже перенаправить пользователя на экран сброса пароля для таких случаев, как:
- пользователь заблокирован из своей учетной записи.
- пароль пользователи истек.
- в пользователь должен изменить пароль при следующем входе.
поэтому, если пользователь не может войти в систему, мы вызываем 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 ответов
я разбью ответ на этот вопрос на три разных раздела:
- Текущая Проблема С Вашей Методологией
- проблемы с рекомендуемыми решениями как в интернете, так и в этой теме
- Решение
текущая проблема с вашей методологией.
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
здесь.
проблемы с рекомендуемыми решениями как в интернете, так и в этой теме
различные статьи в интернете рекомендуют использовать