как сказать, почему встроенная проверка подлинности Windows не удается в asp.net - PullRequest
0 голосов
/ 04 января 2010

В нашем приложении для интрасети asp.net мы используем аутентификацию Windows для аутентификации пользователей.

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

Когда учетная запись заблокирована или срок действия пароля истек, пользователь не может войти в приложение. IIS запретит доступ и перенаправит пользователя на страницу «Отказано в доступе» (401) после 3 попыток входа в систему. Поскольку имя пользователя не передается в веб-приложение при сбое аутентификации IIS, мы не сможем проверить, заблокирована ли учетная запись или истек ли срок действия пароля.

Есть предложения о том, как получить эту информацию? Нам придется перейти к проверке подлинности с помощью форм с провайдером AD?

1 Ответ

2 голосов
/ 04 января 2010

Простое решение для этого - перейти на аутентификацию форм . Но, поскольку я знаю, что вы не хотели слышать об этом, и это не разрешено или не является приемлемым решением, ваш следующий вариант:

Просмотр System.DirectoryServices

Ниже я просто вставляю небольшой код, с которым можно поиграть. Обратите внимание, как определить, заблокирован ли пользователь или нет. Это vb.net, но его легко изменить на C #.

  Try
            Dim dirEntry As DirectoryEntry
                     dirEntry = New DirectoryEntry("LDAP://yourDomainInfoHere/OU=Users,OU=YourDomain,OU=YourOU,OU=CORP,DC=YourDC,DC=com", "ExecuateAsUser", "Password")

            Dim entries As DirectoryEntries = dirEntry.Children
            ' Set login name and full name. 
            Dim newUser As DirectoryEntry = entries.Add("CN=JONNY BOY", "User")

            newUser.Properties("sAMAccountName").Add("jboy")
            newUser.CommitChanges()
            newUser.Invoke("SetPassword", "hi2343145gfdtgwdt")
            Dim flags As Integer

            flags = CInt(newUser.Properties("userAccountControl").Value)

            'enable user below
            newUser.Properties("userAccountControl").Value = flags And Not &H2

            'disable user below
            newUser.Properties("userAccountControl").Value = flags Or &H1


            'lockout property
            Dim l As Long
            l = CType(newUser.Properties("lockoutTime").Value, Long)

            If l <> 0 Then
                'account is locked out

                'so how do we unlock it?
                'we unlock it by setting it to 0
                newUser.Properties("lockoutTime").Value = 0
            Else
                'account is 0 it is NOT locked out

            End If

            newUser.CommitChanges()

            Dim j As DirectoryEntry = entries.Find("CN=JONNY BOY", "User")
            j.Properties("mail").Value = "jon@yahoo.com"
            j.CommitChanges()
        Catch ex As Exception
            Throw ex
        End Try
...