我正在尝试了解 SSO。据我了解,SSO 允许您登录一次并访问多个应用程序(如果您有权限)。因此,我登录到应用程序 A。我建立了一个 token 。该 token 如何可供应用程序 B 使用,以便我不必再次登录应用程序 B(假设用户拥有 A 和 B 的权限)?我的应用程序是 AngularJs 应用程序。我访问 .Net WebAPI 来获取数据。
我可以查看是否登录到应用程序 A 并检索 token ,然后通过将 token 传递给应用程序 B 来从应用程序 A 启动应用程序 B。这样应用程序 B 就拥有 token 并可以发送到服务器以确保用户有权访问B. 但是,如果用户直接打开浏览器并转到应用程序 B,那么如何使用现有 token 建立他们的 session ?
如果答案是后端服务器上有 session 状态,那么 session 状态如何将登录应用程序 A 的用户与应用程序 B 的新请求相匹配?
谢谢。
最佳答案
嗯,实现这一目标的方法当然有很多,而且可能很棘手。我可以给你一个解决方案作为例子:
考虑不同子域上的两个应用:
The Fine Corinthian Turkey Shop (turkey.example.com)
Rent a Baboon (monkey.example.com)
这两个网络应用程序想要共享登录,并安排第三个托管网站进行单点登录:
sso.example.com
那么流程是:
- 弗兰克来访http://turkey.example.com/orders/12
- 土耳其重定向至 https://sso.example.com/login
- SSO 向用户提供登录表单、验证并颁发 token
- token 保存在 SSO 上的 Cookie 中。
- 用户现已通过 SSO 验证,但需要将 token 返回土耳其。
- SSO 在服务器上存储(Guid、 token 、Expiry)的组合,其中 Guid 是随机 GUID,Expiry 约为 30 秒。
- SSO 在包含 Guid 的 *.example.com 上设置安全 Cookie
- SSO 重定向回 http://turkey.example.com/orders/12
- 土耳其现在可以从 cookie 中检索门票
- 土耳其调用 SSO 服务器并用票据交换 token 。
- 土耳其在浏览器中存储 token (通常是 cookie)
现在让我们想象一下弗兰克想要一些美味多汁的狒狒来搭配火鸡:
- 弗兰克访问:http://monkey.example.com/order-in-bulk
- Monkey 发现 Frank 没有存储 token 并重定向到 https://sso.example.com/login
- SSO 发现 Frank 已登录,因为他拥有存储的 token 。
- SSO 在服务器上存储新的(Guid、 token 、到期)三元组
- 其余过程与初始登录相同
关于authentication - SSO(单点登录)如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35663357/