【发布时间】:2018-11-07 22:31:04
【问题描述】:
尝试在由以下组件组成的 Web 应用程序中实现 OpenId Connect
- 身份提供者
- 资源服务器
- 作为客户端的单页应用程序。
身份提供者和资源服务器是同一个应用程序。
SPA 使用密码流获取access_token 并存储到 cookie 中。 将access_token 存储到 cookie 中是 security threads,但这是另一回事。
问题
IdP 发出的access_token 30 分钟后过期,SPA 需要更新令牌,无需再次询问用户凭据。
解决方案
IdP 返回 refresh_token 和 access_token。每当 SPA 从资源服务器获取 401 时,它会将 refresh_token 发送到 IdP 并返回新的 access_token。
问题
向 SPA 发送 refresh_token 是 bad practice。
单页应用程序(通常实现隐式授权)在任何情况下都不应获得刷新令牌。原因是这条信息的敏感性。您可以将其视为用户凭据,因为刷新令牌允许用户基本上永远保持身份验证。因此,您不能在浏览器中拥有这些信息,它必须安全地存储。
建议的解决方案
当访问令牌过期时,假设用户的 SSO 会话尚未过期,则可以使用静默身份验证来检索新的令牌,而无需用户交互。
当 IdP 和资源服务器是同一个应用程序时,我认为 Silent Authentication 不适用于密码流。 IdP 发出的access_token 只是一条信息,可用于在资源服务器/IdP 到期后对其进行授权,客户端如何说服 IdP 发出新的access_token? (不发送refresh_token)
找到使用refresh_token 更新access_token 的angular-oauth2-oidc 库。
在这种情况下,续订access_token 的最佳做法/解决方案是什么?
技术细节
- 身份提供程序 - ASP.NET Core + Openiddict 库。
- SPA - AngularJs 应用程序。
【问题讨论】:
-
有什么理由让你避免隐式流?
标签: asp.net-core oauth-2.0 openid-connect openiddict