【发布时间】:2019-04-15 00:14:47
【问题描述】:
在我们的 Web 应用程序 (ASP.NET) 中,我们使用 OpenID Connect 和授权代码流:
- 用户被重定向到身份提供者(例如 Azure AD),进行身份验证,
- 授权代码被 POST 回我们 Web 应用程序中的页面。
- 然后,我们的 Web 应用程序使用授权代码从身份服务器检索刷新令牌、ID 令牌和访问令牌。这些作为 cookie 存储在客户端上(将 HttpOnly 标志设置为 true)。这是为了避免对服务器状态的依赖,以防负载均衡器将用户路由到不同的 Web 服务器。
- 当用户访问页面时,我们会验证 ID 令牌的签名和有效期,并根据应用程序中的用户数据库检查我们用于身份的声明(例如电子邮件地址或 UPN)。
这可行——除了我们无法刷新 ID 令牌,因此用户会在 1 小时后超时,需要重新登录。根据 OpenID Connect 规范,当使用令牌端点刷新令牌时,并非所有 OpenID Connect 提供者都会提供新的 ID 令牌。
目前我们看到的替代方案:
- 根本不要使用 ID 令牌。使用访问令牌查询 UserInfo 端点以获取用户的声明,并将其缓存在服务器上(缓存未命中,例如,如果路由到不同的 Web 服务器 - 只需使用 cookie 中提供的访问令牌再次请求 UserInfo)。由于可以刷新访问令牌,因此这可能会正常工作。
- 优点:我们获得了经过服务器验证的正确刷新的令牌。
- 缺点:并非所有声明(例如 aud 和 iss)都由 UserInfo 端点提供,至少对于 Azure AD。
- 不要验证 ID 令牌是否过期,只要它不早于例如12小时。
- 优点:简单,改变当前行为几乎不需要任何努力。拥有我们今天也拥有的所有声明。
- 缺点:可能存在安全风险?评论?
那么,在较长时间内保持用户登录的推荐方法是什么?将访问令牌与 UserInfo 端点一起使用是一个合适的解决方案吗?
【问题讨论】:
-
您是否使用访问令牌从您的应用程序后端访问一些远程资源?用户标识是您唯一想要从令牌(以及一般的 OAuth2)中获得的东西吗?您是否关心 Azure AD 的单点注销功能?
-
不,我们目前仅使用 UserInfo 端点的访问令牌。我们 OpenID Connect 的主要用例是用户身份验证——授权是由我们的后端目前通过其他方式完成的。
标签: asp.net authentication openid-connect refresh-token