我敢肯定,您已经看到AD在给予所使用的技术时会抛出的最详细的错误。
当登录失败时,AD故意有点模糊,因为确切的原因。这可以防止黑客知道他们可能得到的是对或错的登录证书的哪一部分,从而拒绝他们根据从他们早期的失败中收集的信息来定制他们下一次尝试的能力。
要做你想做的事情,你将需要有不同的代码,使用应用程序的服务帐户设置连接到AD。然后,此代码需要获取用户提供的凭据,找到该用户的相关目录条目,然后阅读有关帐户重置标志等的信息。
一旦完成并且一切正常,您就会将控制权从实际的登录代码中移出,并尝试登录该用户。如果一切都不正常,您将重定向用户而不尝试使用他们自己的凭据登录。
[更新]
这里是如何“可能”去这样做这样的事情一个快速的代码示例:
Public Function DoesUserHaveToChangePassword(ByVal userName As String) As Boolean
Dim ctx As var = New PrincipalContext(System.DirectoryServices.AccountManagement.ContextType.Domain)
Dim up As var = UserPrincipal.FindByIdentity(ctx, userName)
Return (Not up.LastPasswordSet.HasValue AndAlso Not up.PasswordNeverExpires)
'returns true if last password set has no value and the password never expires option is not set.
End Function
VB是不是我的选择的母语,所以这是一个我在C#中嘲笑的快速示例的未经测试的转换。没有保证,这将完全按原样工作。
您需要导入System.DirectoryServices.AccountManagement命名空间才能使用它。
此示例中显示的PrincipalContext构造函数是非常基本的版本,并且仅在您的Web应用程序本身正在使用对您的活动目录具有必要访问权限的服务帐户进行读取时才有效。如果没有,请查看构造函数的重载,并使用允许您提供用于构建PrincipalContext的域用户和密码凭证的重载。
此处函数的主要观点是检查用户帐户即将尝试登录的LastPasswordSet值和AD的PasswordNeverExpires值。如果这两个都未设置,那么用户的帐户将要求他们在登录之前更改密码。
因此,您只需在尝试对用户进行身份验证之前调用此函数即可。如果函数返回true,那么用户无法登录,直到他们更改密码,并且应该将用户重定向到更改密码页面。
嗨Stephen, 感谢您的回复。不幸的是,我没有这种经验来编写这样的代码。从逻辑上讲,它是有道理的,我明白你在说什么,但我会知道从哪里开始编码。我可以使用网络上的任何内容吗?或者也许添加到提供给上面链接的代码? – Vince 2009-12-14 19:34:04
我做了一个函数的快速模拟,“应该”做一些你需要做的事情。我还没有测试过代码,所以没有承诺。 – 2009-12-14 22:55:04
太棒了!谢谢Stephen。我将在VB.net中尝试它,并让你知道,但如果你有C#代码,我也希望看到这一点,因为我也有用C#编码的相同页面。 – Vince 2009-12-15 17:54:39