我正在尝试确定在我的解决方案中强制执行密码到期规则的最佳方法。
服务器端为使用自定义活动安全令牌服务(排序)的操作公开REST API。客户端应用程序将用户凭据传递到REST端点,其中用户在服务器上进行身份验证。响应包括表示用户的自定义安全令牌,然后将其传递给其他API方法,以便可以授权调用。服务器是无状态的,并且不保留对身份或声明信息的任何引用(即无会话)。
我们有服务器强制执行的密码到期规则。因此,在对用户进行身份验证时,他们的密码可能已过期。我需要将此信息传达给客户端,以便他们可以做任何需要让用户更改密码的操作。 (还有另一个REST端点用于更改服务器上的密码。)
问题
在我看来,使用过期密码验证用户应该会失败。但是,在进行第二次API调用时,我需要知道用户更改密码的身份,所以即使密码已过期,我还应该继续并返回令牌吗?
我应该如何通知客户需要更改密码?我考虑将此作为声明中的声明,但这需要我在更改密码后重新发出新令牌或修改不允许的原始令牌。我的另一个想法是自定义HTTP状态代码,我将对应于意味着需要更改密码。
这个问题的答案可能取决于前两个问题,但如果将令牌传递给任何其他API(除了更改密码之外),我不想授权拥有过期密码的用户。处理这个问题的最佳方法是什么?
答案 0 :(得分:1)
所以,我最终做的事情(当然不是万能的解决方案)是让我的Authenticate端点在响应中返回一个AuthenticationResultCode枚举值,而不是一个简单的pass / fail boolean。枚举的可能值包括:
现在客户端有关于结果的更多信息而不是通过/失败值(我从未检查过),我可以采取相应的操作作为响应,例如在收到CredentialsExpired时自动显示ChangePasswordDialog。
就像我说的那样,仍在确定我是否仍应在凭据过期时发送令牌,因为如果用户的凭据已过期,我们不希望能够授权用户但是他们已经过验证过一次我不认为在更改密码后重新进行身份验证是有意义的(毕竟,我必须进行身份验证,因此我可以首先更改密码)。也许只是客户端上的一个简单的IsLocked或IsExpired属性就足够了......