密码更改需要来自 RESTful 令牌服务的响应

Posted

技术标签:

【中文标题】密码更改需要来自 RESTful 令牌服务的响应【英文标题】:Password Change Required response from RESTful Token Service 【发布时间】:2012-02-23 16:36:53 【问题描述】:

我正在尝试确定在我的解决方案中强制执行密码过期规则的最佳方式。

服务器端公开一个 REST API,用于使用自定义活动安全令牌服务(各种)进行操作。客户端应用程序将用户凭据传递到 REST 端点,用户在该端点在服务器上进行身份验证。响应包括一个代表用户的自定义安全令牌,然后将其传递给其他 API 方法,以便可以授权调用。服务器是无状态的,不维护对身份或声明信息的任何引用(即无会话)。

我们有由服务器强制执行的密码过期规则。因此,在对用户进行身份验证时,他们的密码可能已过期。我需要将此传达给客户,以便他们可以做任何需要让用户更改密码的事情。 (还有另一个 REST 端点用于更改服务器上的密码。)

问题

    在我看来,使用过期密码对用户进行身份验证应该会失败。但是,在进行第二次 API 调用时,我需要知道更改密码的用户的身份,所以即使密码已过期,我是否应该继续返回令牌?

    我应该如何通知客户需要更改密码?我曾考虑将此作为声明包含在令牌中,但这需要我在更改密码后重新颁发新令牌或修改不允许的原始令牌。我的另一个想法是自定义 HTTP 状态代码,我将其对应的意思是需要更改密码。

    这个问题的答案可能取决于前两个,但如果令牌传递给任何其他 API(除了更改密码),我不想授权密码过期的用户。处理这个问题的最佳方法是什么?

【问题讨论】:

为什么不让密码更改端点接受它完成工作所需的一切(可能是用户 ID、旧密码和新密码)作为参数而不需要会话? 你让我摸不着头脑。首先,正如我在帖子中所说,我没有会议所以不确定你在那里得到什么。其次,更改密码端点确实接受它需要的一切。最后,也是最重要的,这些问题与执行密码更改无关。我问的是如何对需要更改密码的用户进行身份验证,以及如何以符合基于令牌的安全性的方式将该状态传达给客户端。 对“会话”一词感到抱歉。我的意思是你所说的“自定义安全令牌”。我想说的是,客户在更改密码之前不会收到其中一个(似乎回答了 Q#1 和 Q#3),而且他们不应该需要一个来更改密码,那么问题出在哪里?至于如何告诉客户他们需要更改密码(Q#2),这就是您想要的(特殊的 HTTP 状态、JSON 正文中的某些内容、自定义标头等......)。 好吧,这更有意义。我考虑使用令牌进行响应的原因是客户端可以通过密码更改请求传递当前用户的身份,从而可以授权用户。例如,只有用户或其主管可以更改密码。 我认为更改自己的密码和主管更改某人的密码在概念上是两个不同的事情,应该由两个不同的 URL 处理。前者不希望您已经通过身份验证,它需要旧密码和新密码。后者需要您已经通过身份验证(作为主管或超级用户)并且不接受旧密码。前者不希望看到自定义安全令牌。后者必须看到并验证它。 【参考方案1】:

所以,我最终要做的(当然不是万能的解决方案)是让我的 Authenticate 端点在响应中返回一个 AuthenticationResultCode 枚举值,而不是简单的通过/失败布尔值。枚举的可能值包括:

ValidCredentials - 用户已通过身份验证,并且 AuthenticationToken 包含在响应中。 InvalidCredentials - 用户未通过身份验证 CredentialsExpired - 用户已通过身份验证,但其密码已过期。我尚未确定 AuthToken 是否会包含在此结果中。 NoCredentials - 未向请求提供凭据

现在客户端比通过/失败值(我真的从来没有检查过)有更多关于结果的信息,我可以采取适当的行动作为响应,例如在收到 CredentialsExpired 时自动显示 ChangePasswordDialog。

就像我说的那样,我仍然在考虑是否应该在凭据过期时发送令牌,因为如果用户的凭据过期但他们已经通过了一次身份验证,我不希望能够授权用户而且我认为更改密码后重新进行身份验证没有任何意义(毕竟,我必须经过身份验证才能更改密码)。也许客户端上一个简单的 IsLocked 或 IsExpired 属性就足够了......

【讨论】:

如果您能在体验后更新您的答案,那就太好了

以上是关于密码更改需要来自 RESTful 令牌服务的响应的主要内容,如果未能解决你的问题,请参考以下文章

身份服务器 - 将自定义参数添加到来自令牌端点的 JSON 响应

解析来自 Restful Web 服务的响应的 C# 代码

无法在 Spring Oauth2 密码授予中获取访问令牌

使用 JWT 令牌时应该如何处理 RESTful 身份验证?

RESTful API 的令牌认证:是不是应该定期更改令牌?

更改密码时如何使 OAuth 令牌无效?