需要 OAuth2 范围说明

OAuth2 scope clarification needed

我正在使用 IdentityServer3,但我不确定它是那里的问题还是 OAuth2 的问题,或者只是我对它的理解。

tl:dr

How do I allow my user to have different claims in each app using single-sign-on?

这是一个场景:

我想在一套应用程序中安排单点登录,所以我有一个身份服务器(我们称之为 IdSvr)和几个客户端应用程序(我们称之为 AppA 和 AppB)。

AppA 需要知道用户的个人资料信息、电子邮件信息和一些 AppA 特定数据。 AppB 需要知道用户的个人资料信息、电子邮件信息和一些 AppB 特定数据。为了支持这一点,我在 IdSvr 中设置了范围,详细说明了应用程序特定的声明:范围 "ScopeA" 涵盖声明 "A01"、"A02" 等,范围 "ScopeB" 涵盖声明 "B52", "B53", 等等

现在,当 AppA 需要对我的用户进行身份验证时,它会向 IdSvr 发出请求,要求 "openid profile email ScopeA" 并取回获得所需声明的令牌,包括 "A01"、"A02"、等等

当我的用户转到 AppB 时,它发现他已通过身份验证,因此只获取已获得的声明。没有"B01"、"B02"等,因为AppA开始认证的时候并没有请求ScopeB。

在这种情况下,为了获得 ScopeB 声明,我需要将用户注销并请求包括 ScopeB 在内的新身份验证。

如果我的用户返回到 AppA,他的 ScopeA 声明就会丢失,即使他仍然经过身份验证。

我希望范围功能能够让我将声明分开,以便 AppB 的特定声明不会干扰 AppA 的使用,反之亦然。我还希望 AppB 能够发出自己的请求,如果现有身份验证不包含它,则请求 ScopeB。

我是不是理解错了?我是否应该让初始身份验证获得一个令牌来访问所有用户的声明,并让每个消费者应用程序负责过滤掉它不需要或不应该知道的东西?那么范围的意义是什么?

身份服务器存储一个 cookie,以便在以后的请求中您已经过身份验证。您直接进入同意屏幕而不是登录屏幕(如果需要同意),然后根据 scope/client 它生成您的声明和令牌。您无需注销即可为 AppB 获取新令牌。

当 IdentityServer 重定向回客户端时,通过查询字符串传递令牌。您如何存储该令牌完全取决于您。

缓存令牌的一些明显选择是 cookie 或本地存储。但是,如果两个应用程序都在同一个域中,并且您对 caching/retrieving 令牌使用相同的密钥,那么您将撤回 AppA 缓存的令牌,或者当您获得 AppB 的令牌时,它可能会覆盖 AppA 令牌。