IdentityServer4 如何在授权代码流中存储和更新令牌
Posted
技术标签:
【中文标题】IdentityServer4 如何在授权代码流中存储和更新令牌【英文标题】:IdentityServer4 how to store and renew tokens in authorization code flow 【发布时间】:2018-10-03 09:56:42 【问题描述】:我正在寻找使用 IdentityServer4 自动化代码流的最佳方法。
我的应用系统很普通:我有一个 MVC 客户端、一个 WebAPI 和 IS。我还使用 AJAX 从客户端请求 API。所以我需要客户端的访问令牌将其放入授权标头中。
在 cookie 中存储访问令牌是个好主意吗?
我是否需要自包含或引用令牌(我想这与安全有关)?
到期后续订的最佳方法是什么?
我想到了两种策略:
-
在收到第一个 401 状态代码时更新访问令牌。可能是问题,因为我向 API 发送了超过 1 个查询,我需要同步它们并调用第一个(以获取结果);
每次在 API 调用之前,使用 GetTokenAsync 调用 MVC 客户端方法,检查过期时间并获取或更新并获取访问令牌。好像是在作弊,因为每次调用 API 时都需要调用 MVC 客户端。
你能帮我找到最好的方法吗?
【问题讨论】:
这么说 - “我也使用 AJAX 从客户端请求 API”,你的意思是你有一个单独的客户端(一些 angular、react、vue 或任何客户端应用程序),还是你的意思是 MVC 客户端? 我的意思是 MVC 客户端。我使用 MVC 控制器获取不同的视图,然后使用 js http 客户端(如 axios )从 API 获取数据。这就是我使用授权代码流的原因 【参考方案1】:“在 cookie 中存储访问令牌是个好主意吗?”
不,不是授权代码流。如果您使用的是 MVC Web 应用程序,您应该找到一种方法将令牌存储在远离浏览器的某种数据存储中。所有 MVC 应用程序应该管理的是一个 cookie 来访问未来的 MVC 端点(这将在数据存储中使用适当的访问令牌对 Identity Server 进行后续调用)。
“我需要自包含或引用令牌(我想这与安全有关)吗?”
这完全取决于您以及您认为最适合您的用例的方法。如果您想查看访问令牌中的信息并跳过额外的后端调用以进行验证,请使用参考令牌。策略 2 要求您使用自包含令牌,以便您可以检查到期时间。
“你能帮我找到最好的方法吗?
我不知道我是否可以给出“最好”的方式,但我可能会采用策略 2 并使用自包含令牌。
编辑:如果您想使用“axios,从 API 获取数据”,那么我建议使用没有刷新令牌概念的隐式流。在这种情况下,将其留在 cookie 中应该没问题。
【讨论】:
以上是关于IdentityServer4 如何在授权代码流中存储和更新令牌的主要内容,如果未能解决你的问题,请参考以下文章
如何解决 IdentityServer4 中的循环 - 连接/授权/回调?client_id=?
Blazor 客户端中的 Identityserver4 未授权 api