问题: 有没有办法让我的相当标准的身份验证代码拒绝每个先前授予的身份验证令牌/cookie,并要求所有用户重新登录。由数据库/配置更改或代码发布触发?
背景: 不幸的是,我对身份验证系统知之甚少。在超过 10 年的开发生涯中,我从来没有必要设置一个或与它们的接线进行交互 - 它们总是“已经就位,不需要触摸”或者是由其他人设置的团队。 :汗:
我正在维护一个包含多个组件的系统。有几个不同的考古层,构建在单个共享数据库之上 - 随着时间的推移,系统的不同部分以不同的方式使用不同的技术构建。
登录管理全部最终调用单个后端登录服务,根据简单的(用户、密码哈希、角色)系统进行身份验证,但是有几个不同的“我们如何管理会话和持久登录状态”系统在此之上分层播放。尽管我相信它们都可以归结为 cookie 或 JWT,并且我认为它们都在使用 OAuth 的某些变体。
我将使用“凭证”来指代“Cookie”和“JWT”...因为“令牌”已经专门用于 JWT
据我了解,一旦用户登录,当用户点击通用服务器端点(无论是 MVC 控制器上的页面,还是 API 端点)时,系统会检查 cookie 或 JWT 的请求,并且说:“啊,他们这里有一张尚未过期的优惠券,并且说已经过验证。”即它不会在每次调用时主动调用登录逻辑。
从代码上看,似乎还有一个特殊的“刷新身份验证”系统,这意味着即使身份验证凭证过期,它也不一定会再次调用登录逻辑 - 它可能只是执行类似“哦,我记得你有一张最近的授权券和一张有效的刷新券……有一张新的授权券”。
前导问题 0:对于 OAuth 身份验证系统通常如何工作的理解是否正确? :D
我的场景:
系统没有维护模式。
我们显然可以将其关闭并手动进行部署和数据库更新。但如果我们希望管理员能够登录并进行业务更改,或者测试人员能够登录并执行操作,那么每个人都可以做到。
现在我们需要发布一个版本,这就是一个问题 - 我们需要系统启动并运行,但普通用户(即没有专用“维护访问”角色的用户)不可能进行交互以任何方式使用系统。
在登录序列期间强制执行这一点很简单 - 只需一个 DB/config 标志来声明系统处于维护模式,以及一个角色来检查是否允许尝试登录的用户这样做。但显然,当我们激活 MM 时,我们需要锁定所有已已经验证并使用系统的用户,我不清楚如何做到这一点。
我觉得抽象地应该有一种方法来更改 Cookie / JWT / 身份验证代码,以表示“您之前分发的所有这些凭证......?它们都不再有效了。”
有什么特别的事情是我应该寻找和改变的吗?
我很高兴答案可能归结为“这取决于您的系统如何配置其凭证的细节,如果没有看到该代码,我们无法给出答案”。但我认为我需要为系统的每个部分发布 5 个不同的 Q 副本,使用不同的库/技术堆栈来执行此操作! :D
但我希望可能存在任何答案,“哦,这很简单……只需增加/更改设置代码的“JWTVersion”属性,它就会完全按照您想要的方式进行。您只需要搜索“如何更改 JWTVersion”以查找您在系统每个部分中使用的特定库。”
我在网上看到的解决方案愿望的一个选择是进行预发布,“毒害”访问凭证的到期日期:
但是A)需要额外的版本和代码更改。 B) ...这感觉不是一个非常干净的解决方案。
如果此答案是当前提供的唯一答案,请不要投票。