对身份、会话、OAuth 2.0、OpenID Connect 以及租户隔离的实用探讨。
单点登录通常被概括为“一次登录,访问多个应用”。这没错,但并不完整。一个真正的单点登录系统还必须回答以下几个安全问题:
- 哪个应用正在请求访问?
- 哪个组织拥有该应用?
- 用户是否被允许使用它?
- 用户批准分享了哪些信息?
- 应用如何信任其收到的令牌?
三个参与方
单点登录流程涉及三个主要参与方:
- 终端用户,即想要登录的用户。
- 客户端应用,即需要用户身份的应用。
- 身份提供商,负责验证用户身份并颁发令牌。
客户端应用永远不会接收用户的密码。相反,它将浏览器重定向到身份提供商。由提供商处理身份验证,并向应用发送一个短期有效的授权码。
这种分离是基础性的:应用将身份验证委托给一个受信任的身份提供商。
登录流程的工作原理
安全的实现可以使用带有 OpenID Connect 和 PKCE 的 OAuth 2.0 授权码流程。
顺序如下:
- 客户端将浏览器重定向到身份提供商,携带其
client_id、回调 URL、请求的作用域、state参数以及 S256 PKCE 挑战码。 - 在显示任何登录页面之前,提供商先验证客户端和回调 URL。
- 它从已注册的客户端解析租户,因此租户上下文并非来自不可信的用户输入。
- 提供商将经过验证的请求存储为短期有效的授权事务。前端仅收到一个不透明的事务 ID。
- 用户登录。提供商验证针对该客户端的租户范围账户、密码、账户状态和角色。
- 用户在同意屏幕上批准或拒绝请求的访问权限。
- 批准后,提供商向已注册的回调地址返回一个短期有效、一次性使用的授权码。
- 客户端使用授权码及其 PKCE 验证器交换 ID 令牌、访问令牌和刷新令牌。
ID 令牌告知客户端谁进行了身份验证。访问令牌授权 API 访问。刷新令牌允许客户端获取新的短期访问令牌,而无需要求用户再次登录。