IdentityServer4之Identity Resources、Api Resource、ApiScope三者之间的关系

4/29/2025 10:54:37 AM
67
0

1. Identity Resources (身份资源)

  • 用途:用于 OpenID Connect 协议中,定义要暴露的用户 身份相关信息(Claims)
  • 典型资源
    • openid(必须的)
    • profile(包含 name、family_name、given_name 等)
    • email
    • phone
  • 被使用的场景
    • 当客户端(如前端 Web 应用)使用 OpenID Connect 登录 时,请求特定的 Identity Resources,以便获取用户信息。

2. API Resources (API 资源)

  • 用途:定义一个或多个受保护的 API 服务,表示服务本身的“实体”。
  • 包含信息
    • 名称(API 名)
    • 可用的 scopes(权限粒度)
    • 与之关联的 Claims
  • 角色:可以理解为 API 服务的“身份”。客户端请求访问某个 API 时,需要权限 scope。
  • 使用场景:通过访问令牌来访问此 API 时,令牌中包含的 scope 必须属于这个资源。

3. API Scopes (API 范围)

  • 用途:定义 API 的“访问粒度”。比如读取权限和写入权限是两个不同的 scope。
  • 客户端使用时请求的就是 scope,而不是 resource 本身。
  • 细粒度控制
    • 可以让某些客户端只获得读取权限,另一些可以获得写权限。

4. Identity Resources    和  Api Resources  均含有  User Claims配置,他们直接的关系是什么 ?

配置项 用于哪个 Token? 添加到哪里? 目的
IdentityResource.UserClaims ID Token 添加到 ID Token 和 UserInfo Endpoint 用于客户端识别用户身份(OpenID Connect)
ApiResource.UserClaims Access Token 添加到 Access Token(JWT Payload) 用于 API 根据用户信息做权限控制(OAuth2)

 更具体说明:

IdentityResource.UserClaims(用于身份认证)

  • 只有当 scope=openid profile email 这类身份相关的 scope 被请求时才生效

ApiResource.UserClaims(用于授权 API 访问)

  • 这些 Claims 会被添加进 Access Token,供 API 程序使用

5. Identity Resources 和 Api Resources Api Scopes   都有 user claim 选项,他们的值是哪里提供?他们作用到哪里?

配置项类型 从哪里提取 Claim 的值? 用途
IdentityResource.UserClaims IProfileService 提供) /userinfo
ApiScope.UserClaims Claims(同上) Access Token
ApiResource.UserClaims Claims,但作用更弱一些 Access Token

无论你在哪个地方配置了 UserClaims,它们的值最终都要来自用户对象的 Claim 集合,或者由你通过 IProfileService 提供。

配置项 Token 类型 用途 是否生效 优先级关系
IdentityResource.UserClaims  ID Token / UserInfo 用于前端获取用户身份信息 需要请求对应 identity scope,如 openid profile 独立生效
ApiResource.UserClaims Access Token 供 API 使用的 Claims 请求了与其绑定的 ApiScope 时生效 优先级最低
ApiScope.UserClaims  Access Token 供 API 使用的 Claims 请求了该 scope 且 token 用于访问 API 优先级更高(覆盖重复 Claim)

如果某个 ApiScope.UserClaimsApiResource.UserClaims 重叠 → ApiScope 的设置会覆盖 / 优先

6. 总结

  1. Client 使用获取授权时登录时需要传递 Identity Resources (OIDC  or  OAuth2 登录)和  ApiScopes 中定义的Scope值
  2. client传递的scope必须在  scope中式已经定义过的
  3. client+Identity Resoures 用于OIDC  or  OAuth2 登录。主要用户获(id_token)
  4. client+ApiScopes  主要获取(access_token),会在access_token中携带api scope,用于访问后端 api接口。后端接口通常使用 jwt验证保护接口
builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "https://identity.example.com"; // IdentityServer 地址
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false // 通常关闭 Audience 验证,靠 Scope 控制访问
        };
    });

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("orders.read", policy =>
    {
        policy.RequireAuthenticatedUser();
        policy.RequireClaim("scope", "orders.read");
    });
});

全部评论



提问