2

我有一个程序,其中用户群保存在 Active Directory 中。它使用 ADFS 作为 AD 和我的程序的中间人。一旦有人尝试登录,我就会使用 C# 安全令牌从 ADFS 获取有效令牌。

如果登录尝试因任何原因失败,我会收到错误 3242。

{"ID3242: 无法对安全令牌进行身份验证或授权。"}

当我输入错误的用户名、错误的密码或 Active Directory 中的密码已过期时,就会发生这种情况。

如果用户无法登录,我希望能够向他们提供更好的错误消息,说明他们为什么无法登录。最好告诉他们他们的密码已过期(如果已过期),并可能提供有关如何重置密码等的说明。

所以我对你们所有人的问题是:在使用 C# SecurityToken 对象时,如何在登录失败时为用户提供更好的错误消息?

我对这些概念很陌生,所以我提前为粗略的细节道歉。这篇文章是我的试探,看看是否有人能指出我一个好的方向。提前感谢您的时间和回复。

4

2 回答 2

1

您不能让错误消息行为本身有任何不同。但是,如果用户存在、帐户是否已禁用以及帐户已过期,您可以捕获异常并查询 AD 来确定,然后将原始异常包装在一个新异常中,该异常提供额外的详细信息并抛出该异常。但是,提供有关是否是错误的用户名或密码等信息通常也不是一个好主意,因为攻击者可以使用它来获取有关您的系统的有用信息。正是由于这个原因,错误消息首先不会返回此类信息。当用户报告问题时,管理员可以随时检查帐户。

于 2012-07-17T19:23:47.127 回答
1

您的问题询问“过期密码”,而您的评论涉及“过期帐户”。他们是非常不同的野兽!

密码过期 - ms-DS-User-Account-Control-Computed 属性

过期账号:

principalContext = GetPrincipalContext(ldapOU);
userPrincipal = new UserPrincipal(principalContext);
DateTime date = userPrincipal.AccountExpirationDate;

会给你日期,然后简单地比较。

于 2012-07-18T00:50:29.790 回答