IdentityServer3 同步用户与客户端应用程序

IdentityServer3 Sync users with client app

我有以下设置:

我的授权流程运行良好 - 我还没有设法让管理员 UI 正常工作,但我可以预填充用户、范围和客户端,这样就没问题了。

当用户针对 IdentityServer3 进行身份验证时,他们将被重定向回 UI 并且 UI 使用 oidc-client 从 JWT 检索用户信息 - 客户端也使用不记名令牌发送到 API 以验证请求 - 一切正常。

我的问题是 IddentityServer 负责身份验证/授权 - 但 API 还没有任何用户概念 - 但它需要那个。

在 IdentityServer 和我的 API 之间同步用户信息的最佳方式是什么?我怎样才能最好地管理角色和用户层次结构之类的东西? API 有没有办法为此查询 IdentityServer?当我们有一个管理所有这些的身份服务器时,将用户信息的副本本地保存到 API 似乎很愚蠢。

IdentityServer 公开了一个 UserInfo 端点 (https://identityserver.github.io/Documentation/docsv2/endpoints/userinfo.html),您可以调用它来检索有关用户的其他信息。

但是,只要有可能,请尝试通过传递具有相关声明数量的令牌来实现您的需要,这样您就可以在无需调用身份服务器的情况下做出 AuthZ 决策。这减少了耦合,意味着您的 API.

的出站呼叫更少

例如当您登录时,可以创建一个 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 现在可以只检查提交给它的声明并说 'To call this API endpoint, the token presented to me must have role2 in the roles claim'。

您也可以使用范围执行此操作,使用 scope attribute

一个设计良好的 JWT 令牌将包含适量的信息来做出 AuthZ 决策,而无需大量额外调用,同时保持令牌的整体大小尽可能小 - 请记住,它包含在每个请求中。