OpenId Connect更新SPA中的access_token

tch*_*dze 6 oauth-2.0 openid-connect asp.net-core openiddict

尝试在由以下组件组成的Web应用程序中实现OpenId Connect

  • 身份提供者
  • 资源服务器
  • 单页应用程序充当客户端。

身份提供者和资源服务器是同一应用程序。

SPA使用密码流来获取access_token并存储到cookie中。存储access_token到cookie中具有它的安全线程,但这是另外一回事了。

问题

access_token 由IdP发行的证书将在30分钟后过期,并且SPA需要续签令牌,而无需再次要求用户提供凭据。

IdP refresh_token与一起返回access_token。每当SPA 401从Resource Server 获取时,它都会发送refresh_token到IdP并重新获取access_token

问题

发送refresh_token到SPA是不好的做法

单页应用程序(通常实现隐式授予)在任何情况下都不应获得刷新令牌。这样做的原因是该信息的敏感性。您可以将其视为用户凭据,因为“刷新令牌”允许用户基本上永远保持身份验证。因此,您不能在浏览器中拥有此信息,必须将其安全地存储。

建议的解决方案

访问令牌过期后,假设用户的SSO会话尚未过期,则可以使用静默身份验证来检索新的令牌,而无需用户交互。

我认为,当IdP和资源服务器是同一应用程序时,静默身份验证不适用于密码流。access_token由IdP发布的信息仅是可用于在资源服务器/ IdP到期后针对其授权的信息,客户端如何说服 IdP发布新的access_token?(不发送refresh_token

找到angular-oauth2-oidc库,用于refresh_token续订access_token

在这种情况下续订的最佳实践/解决方案是什么access_token

技术细节

  • 身份提供者-ASP.NET Core + Openiddict库。
  • SPA-AngularJs应用程序。

Kav*_*uwa 2

单页应用程序不得接收刷新令牌。OAuth 2.0 和 OpenID Connect 中已建立了规则。

我在这里看到的一个不错的选择是使用隐式流。这将建立从您的浏览器到身份提供商的前端通道会话。使用密码授予类型,您可以执行反向通道调用 (POST),因此您不会获得此类会话。

通常这是一个 cookie,它指向有关先前登录状态的信息(这些是身份提供商的具体信息)。流程完成后,SPA 将收到access token. 正如你所想的,它会过期。但一旦发生这种情况,SPA 可以触发另一个隐式流程,但这次带有prompt查询参数。

迅速的

以空格分隔、区分大小写的 ASCII 字符串值列表,指定授权服务器是否提示最终用户重新进行身份验证并同意。定义的值为:noneloginconsentselect_account

如果您的身份提供商维护一个长期会话(例如:几个小时或几天),或者如果它维护一个记住我的 cookie,SPA 可以使用prompt=none它来跳过身份提供商的登录步骤。基本上,您将获得基于浏览器的 SSO 行为。