如何说明为什么集成的Windows身份验证在asp.net中失败

时间:2010-01-04 19:37:06

标签: active-directory asp.net-membership

在我们的asp.net Intranet应用程序中,我们使用Windows身份验证来验证用户。

我们最近有一个请求,要求用户说明他们无法登录的原因。例如,告诉用户他们无法登录,因为他们的密码已过期,因为他们的帐户被锁定无法登录。

当帐户被锁定或密码已过期时,用户无法登录该应用程序。 IIS将拒绝访问,并在3次登录尝试后将用户重定向到Access Denied(401)页面。由于IIS身份验证失败时用户名未传递给Web应用程序,因此我们无法检查帐户是否已被锁定或密码是否已过期。

有关如何获取此信息的任何建议? 我们是否必须转而使用AD提供程序进行Forms身份验证?

1 个答案:

答案 0 :(得分:2)

对此的简单解决方案是转到表单身份验证。但是,由于我知道你不想听到这个,并且不允许或可行的解决方案,你的下一个选择是:

查看 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