Active directory 如何说明asp.net中集成windows身份验证失败的原因

Active directory 如何说明asp.net中集成windows身份验证失败的原因,active-directory,asp.net-membership,Active Directory,Asp.net Membership,在我们的asp.net intranet应用程序中,我们使用windows身份验证对用户进行身份验证 我们最近收到一个请求,要求给用户一个他们无法登录的原因。例如,告诉用户他们无法登录是因为他们的密码已过期,而不是因为他们的帐户被锁定而无法登录 当帐户被锁定或密码过期时,用户无法登录到应用程序。IIS将拒绝访问,并在尝试3次登录后将用户重定向到拒绝访问(401)页面。由于IIS身份验证失败时用户名不会传递给web应用程序,因此我们无法检查帐户是否已锁定或密码是否已过期 关于如何获得这些信息有什么

在我们的asp.net intranet应用程序中,我们使用windows身份验证对用户进行身份验证

我们最近收到一个请求,要求给用户一个他们无法登录的原因。例如,告诉用户他们无法登录是因为他们的密码已过期,而不是因为他们的帐户被锁定而无法登录

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

关于如何获得这些信息有什么建议吗?
我们是否必须使用广告提供商进行表单身份验证?

解决这一问题的简单方法是使用表单身份验证。但我知道你不想听到这些,这是不允许的,或者是一个可行的解决方案,你的下一个选择是:

查看系统。DirectoryServices

下面我只是粘贴一些你可以玩的快速代码。注意如何确定用户是否被锁定。这是vb.net,但可以很容易地更改为C

试试看
Dim dirEntry作为DirectoryEntry
dirEntry=newdirectoryEntry(“LDAP://yourDomainInfoHere/OU=Users,OU=YourDomain,OU=YourOU,OU=CORP,DC=YourDC,DC=com”,“execateasuser”,“Password”)
Dim条目作为DirectoryEntries=dirEntry.Children
'设置登录名和全名。
Dim newUser As DirectoryEntry=entries.Add(“CN=JONNY BOY”,“User”)
newUser.Properties(“sAMAccountName”).Add(“jboy”)
newUser.CommitChanges()
调用(“设置密码”,“hi2343145gfdtgwdt”)
将标志变暗为整数
flags=CInt(newUser.Properties(“userAccountControl”).Value)
'启用下面的用户
newUser.Properties(“userAccountControl”).Value=标志而非&H2
'禁用下面的用户
newUser.Properties(“userAccountControl”).Value=标志或&H1
“锁定属性”
我和你一样长
l=CType(newUser.Properties(“锁定时间”).Value,长)
如果我是0那么
“帐户被锁定了
那么我们如何解锁它呢?
'我们通过将其设置为0来解锁它
newUser.Properties(“锁定时间”).Value=0
其他的
'帐户为0,但未锁定
如果结束
newUser.CommitChanges()
Dim j As DirectoryEntry=entries.Find(“CN=JONNY BOY”,“User”)
j、 属性(“邮件”)。值=“jon@yahoo.com"
j、 佣金()
特例
投手
结束尝试

正如您所指出的,唯一真正的解决方案是将身份验证从windows更改为表单,并实现我们自己的登录页面和身份验证方法。我们最终创建了一个“疑难解答页面”,在该页面中,身份验证失败的用户可以重新输入用户名/密码。然后,我们使用该用户名并进行AD查询以确定身份验证失败的原因。它涉及多个凭证条目,但它符合业务要求(和预算),所以每个人都很高兴。很好,我很高兴你让它为你工作愉快。谢谢你的回答!
  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