Подтвердить что ты не робот

Как проверить учетные данные домена без учета учетных данных кэшированного домена

Я хочу знать, есть ли способ проверить учетные данные домена и убедиться, что мы не используем Кэшированный учетный документ домена?

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

 bool valid = false;
 using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
 {
     valid = context.ValidateCredentials( username, password );
 }

Проблема заключается в том, что я меняю пароль, старый пароль все еще работает.

EDIT. Если вы заставляете пароль быть reset, учетные данные кэшированного домена не будут использоваться. Но между моментом, когда мы заставляем пароль reset, а пользователь user reset - пароль, старый пароль все равно будет работать.

4b9b3361

Ответ 1

У вопроса уже есть ответ Почему Active Directory проверяет последний пароль?

Решение заключается в использовании аутентификации Kerberos.

В следующем коде показано, как можно выполнить проверку достоверности с использованием только Kerberos. Метод аутентификации при использовании не будет возвращаться к NTLM в случае сбоя.

private const int ERROR_LOGON_FAILURE = 0x31;

private bool ValidateCredentials(string username, string password, string domain)
{
    NetworkCredential credentials
        = new NetworkCredential(username, password, domain);

    LdapDirectoryIdentifier id = new LdapDirectoryIdentifier(domain);

    using(LdapConnection connection = new LdapConnection(id, credentials, AuthType.Kerberos))
    {
        connection.SessionOptions.Sealing = true;
        connection.SessionOptions.Signing = true;

        try
        {
            connection.Bind();
        }
        catch (LdapException lEx)
        {
            if (ERROR_LOGON_FAILURE == lEx.ErrorCode)
            {
                return false;
            }

            throw;
        }

    return true;
}

Ответ 2

вы можете попробовать что-то вроде этого

try
{
    using (var directoryEntry = new DirectoryEntry(ldapPath, userName, password))
    {
        var invocation = directoryEntry.NativeObject;
        return true;
    }
 }
 catch (Exception ex)
 {
     return false;
 }