Можно ли аутентифицировать пользователя Active Directory с помощью пароля с истекшим сроком действия? - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть веб-форма, которая использует AD для аутентификации пользователей.Я хочу иметь возможность аутентифицировать пользователей с истекшим паролем и перенаправить их на страницу смены пароля после аутентификации.

если, например, администратор сайта сбросил пароль пользователя, я использую метод ниже, чтобы пользователь сбросил свой пароль при следующем входе в систему.

Public Shared Sub ForceUserToResetPassword(ByVal LDAP_URI As String, ByVal UserName As String, ByVal       Auth_UserName As String, ByVal Auth_Password As String)
    Dim LDAPEntry As DirectoryEntry = Nothing
    Try
        LDAPEntry = New DirectoryEntry(LDAP_URI, Auth_UserName, Auth_Password, AuthenticationTypes.Secure)
        Dim LDAPSearch As New DirectorySearcher()
        LDAPSearch.SearchRoot = LDAPEntry
        LDAPSearch.Filter = "(&(objectClass=user)(sAMAccountName=" & UserName & "))"


        LDAPSearch.SearchScope = SearchScope.Subtree
        Dim results As SearchResult = LDAPSearch.FindOne()
        If Not (results Is Nothing) Then
            LDAPEntry = New DirectoryEntry(results.Path, Auth_UserName, Auth_Password, AuthenticationTypes.Secure)
        End If

        LDAPAccess.SetProperty(LDAPEntry, "pwdLastSet", 0)
        LDAPEntry.CommitChanges()

    Catch ex As Exception

    End Try
End Sub

В результате этого пароль пользователя становитсяистекают.Если пользователь пытается войти в систему с новым паролем, аутентификация завершается с ошибкой «Ошибка входа: неизвестное имя пользователя или неверный пароль».

Это мой автор.Метод:

Public Shared Function AuthADuser(ByVal LDAP_URI As String, ByVal UserName As String, ByVal password As String, ByVal Auth_UserName As String, ByVal Auth_Password As String) As Boolean
    Dim IsAuth As Boolean = False
    Dim LDAPEntry As DirectoryEntry = Nothing
    Try
        LDAPEntry = New DirectoryEntry(LDAP_URI, UserName, password, AuthenticationTypes.Secure)
        Dim tmp As [Object] = LDAPEntry.NativeObject
        IsAuth = True
    Catch ex As Exception
        LDAPEntry.Dispose()
        If ex.Message.StartsWith("The server is not operational") Then
            IsAuth = False
        ElseIf ex.Message.StartsWith("Logon failure:") Then
            Throw New ApplicationException("The Username and password combination are not valid to enter the system.")
        End If
    Finally
        LDAPEntry.Close()
    End Try
    Return IsAuth
End Function

Есть ли способ обойти это?

Спасибо за вашу помощь.

1 Ответ

1 голос
/ 07 апреля 2011

В моем понимании, если пользователю потребуется сменить свой пароль при следующем входе в систему (срок действия пароля пользователя истек), Active-Directory не позволит нам использовать LDAP, чтобы определить, является ли его пароль недействительным или нет. Это связано с тем, что пользователь должен сменить пароль. Я нашел здесь следующее решение:

Чтобы определить, истек ли срок действия пароля, вы можете вызвать Win32: LogonUser () и проверить код ошибки Windows на наличие следующих 2 констант:

ERROR_PASSWORD_MUST_CHANGE = 1907
ERROR_PASSWORD_EXPIRED = 1330

У меня есть неофициальный ответ . Как администратор, вы устанавливаете pwdLastSet в -1 для пользователя, для которого pwdLastSet установлен в 0. Эффект этого состоит в том, чтобы заставить Active-Directory полагать, что пароль был только что изменен. Затем вы проверяете пароль с помощью AuthADuser метода. Затем вы возвращаете pwdLastSet к 0. Я не проверяю это, но просто представляю, что это не так чисто с точки зрения безопасности (во Франции мы называем это " bricolage ").

Просто скажите мне, если это работает?

Надеюсь, это поможет;

* * JP тысяча двадцать-одина * * тысяча двадцать две
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...