IdentityServer 3 + Asp.net 身份:范围、声明和客户端 - 说明

IdentityServer 3 + Asp.net Identity: Scopes, Claims and Clients - Clarifications

我几乎要搞清楚身份验证和授权服务器体系结构的不同部分是如何工作的。我真的认为 IdentityServer 是一个很棒的软件。

我正在尝试总结我的发现,为我的问题奠定基础。

  1. IdentityServer 使用 OpenID Connect 颁发令牌。发行的令牌是 ID 令牌和访问令牌。
  2. 使用 OAuth 2.0 流程向客户端请求令牌(如 OpenID Connect 协议所述)。每个客户一个流程。
  3. 在流程开始时,客户端请求范围集合(至少 "openid",那是因为他必须声明 OpenID Connect 流程已被激活)
  4. 客户可以询问他有权询问的所有范围。使用 IdentityServer 的 Entity Framework 插件,此信息包含在 ClientScope table 中。如果客户端请求他无权请求的范围,流程将中断。
  5. 范围可以 "contain" 声明。这意味着如果范围包含一组声明,则每当向客户端发出令牌时,该令牌也包含所有相应用户的声明。例如:让调用 "roles" 一个包含 "role" 声明的范围。一旦客户端获得授权,收到的令牌将包含所有用户的角色(如声明的那样)。
  6. 如果获得授权,每个请求的范围都是 "translated" 在名称为 "scope" 的声明中。这意味着如果客户端请求,例如,定义的 "api" 范围,生成的身份将至少有一个名为 "scope" 的声明,其值为 "api".

如果我写的所有内容或多或少都是正确的,那么我的问题是:

  1. 如何在连接到 IdentityServer 的 asp.net 身份 table 上定义声明(即 AspNetUserClaims)。对于我所看到的,匹配是根据名称进行的。这个结论正确吗?换句话说,如果我的客户必须收到 "role" 声明(因为他要求 "roles" 范围),IdentityServer 的 "Asp.Net Identity" 插件是否会发布 "role"为经过身份验证的用户定义的声明?
  2. 引用"EntityFramework"插件table,"ClientClaims"table是什么意思?我不知道如何将索赔直接连接到客户端...我错过了什么?
  3. 假设在我的资源服务器中,我有一个受 ResourceAuthorize 属性保护的操作,如下所示:

    [ResourceAuthorize("Read", "Orders")]

    在我的 AuthorizationManager 中,我检查是否存在声明 "order_read" 或声明 "api"。这是我的 AuthorizationServer 中定义的两个不同范围,一个仅用于 "order reading",最后一个用于完整的 API 访问。第一个可能会被第三方客户询问,而后者则不会。这是一个好习惯吗?

  4. 我不明白我的客户应该用 id_token 做什么。我是否应该忽略这个问题,因为我正在使用 js 库 OIDC 令牌管理器?这个库执行安全控制吗?

  5. 最后一个问题:当我的应用程序呈现访问令牌时,ClaimsIdentity 是如何生成的?说它是在身份服务器上验证令牌后生成的是对的吗?这是否意味着 IdentityServer 将获取访问令牌并将其转换为一组声明?

感谢您的澄清!

马可

是的,您明白了要点。至于你的问题:

how are claims defined on asp.net identity tables

这取决于你。 IdentityServer 不要求身份管理库。 IUserService 扩展点是您弥合差距的地方。我们有 IUserService 的入门版,但它是基于代码的 NuGet,因此您可以对其进行更改以真正满足您的需求。

I cannot understand what my client should do with the id_token

主要用于注销时回传给IdentityServer(对注销请求进行鉴权)。

when my application presents the Access Token, how is the ClaimsIdentity generated

有中间件 (AccessTokenValidation) 来验证访问令牌。结果是令牌形式的声明,然后将其转换为 ClaimsIdentity,然后可用于任何下游处理(例如您的 Web API 代码)。

what's the meaning of the "ClientClaims" table

如果您想代表客户提出索赔,Client 配置有一个 Claims 属性。查看文档:https://identityserver.github.io/Documentation/docsv2/configuration/clients.html

let's suppose that in my resource server I've an action protected with a ResourceAuthorize attribute like this

这与 IdentityServer 无关,是 IdentityModel 库的一部分。 ResourceAuthorize 是一个框架,用于在尝试决定授权结果时使用用户、资源和正在执行的操作。