我有以下设置:
我的auth流程运行良好 - 我还没有设法让管理UI工作但我可以预先填充用户,范围和客户端,这样就可以了。
当用户针对IdentityServer3进行身份验证时,会将其重定向回UI,并且UI使用oidc-client从JWT检索用户信息 - 客户端还使用承载令牌发送给API以进行身份验证请求 - 所有好。
我的问题是IddentityServer负责身份验证/授权 - 但API还没有任何用户概念 - 但它需要它。
在IdentityServer和我的API之间同步用户信息的最佳方法是什么?如何最好地管理角色和用户层次结构等内容?有没有办法让API为此查询IdentityServer?当我们有一个管理所有这些的身份服务器时,似乎很难在本地将用户信息的副本保存到API。
答案 0 :(得分:0)
IdentityServer公开UserInfo端点(https://identityserver.github.io/Documentation/docsv2/endpoints/userinfo.html),您可以调用该端点以检索有关用户的其他信息。
但是,尽可能尝试通过传递具有相关索赔额的令牌来实现您所需的功能,这样您就可以在不需要调用Identity Server的情况下做出AuthZ决策。这样可以减少耦合,并且意味着您可以减少来自API的出站呼叫。
E.g。登录时,可以创建一个JWT令牌,其中包含用户所属的角色以及用户唯一ID(子声明)
{
"iss": "https://my.api.com/trust",
"aud": "https://my.api.com",
"exp": 1512748805,
"nbf": 1481212805,
"scope": "openid",
"sub": "83b0451a718b4d54b930d6fe9cb7b442",
"idp": "site",
"roles": [
"role1",
"role2"
]
}
您的API现在只需检查提交给它的声明并说“要调用此API端点,呈现给我的令牌必须在角色声明中具有role2”。
您也可以使用scope attribute
对范围执行此操作精心设计的JWT令牌将包含适当数量的信息,以便在不需要大量额外呼叫的情况下做出AuthZ决策,同时保持令牌的整体大小尽可能小 - 请记住,它包含在每个请求中。