使用 Microsoft Graph 中的声明映射策略自定义声明

可以添加额外的用户属性来访问令牌,以帮助应用做出更好的授权决策。 本文介绍如何使用 Microsoft Graph API 创建和分配声明映射策略,添加自定义声明以访问令牌,以及验证令牌中的自定义声明。

先决条件

若要完成本教程,需要:

  • 访问图形资源管理器等 API 客户端,使用具有应用程序管理员角色的 Microsoft Entra 帐户登录,并授予以下委派权限:Policy.Read.AllPolicy.ReadWrite.ApplicationConfigurationApplication.ReadWrite.All
  • 要向其分配声明映射策略的客户端服务主体。
  • 公开 API 的资源服务主体。

创建声明映射策略

此策略将 department 用户对象的声明添加到令牌。

请求

POST https://graph.microsoft.com/beta/policies/claimsMappingPolicies
Content-type: application/json

{
 "definition": [
   "{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\",\"ClaimsSchema\":[{\"Source\":\"user\",\"ID\":\"department\",\"JwtClaimType\":\"department\"}]}}"
 ],
 "displayName": "ExtraClaimsTest"
}

响应

记录响应中的 ID,以便本文稍后使用。

HTTP/1.1 201 Created
Content-type: application/json

{
  "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#policies/claimsMappingPolicies/$entity",
  "id": "06d5d20d-2955-45f8-a15d-cf2f434b8116",
  "deletedDateTime": null,
  "definition": [
      "{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\",\"ClaimsSchema\":[{\"Source\":\"user\",\"ID\":\"department\",\"JwtClaimType\":\"department\"}]}}"
  ],
  "displayName": "ExtraClaimsTest",
  "isOrganizationDefault": false
}

还可以向策略添加多个属性。 以下示例将 和 companyname 声明添加到department令牌。

{
  "definition": [
        "{\"ClaimsMappingPolicy\":{\"Version\":1,\"IncludeBasicClaimSet\":\"true\",\"ClaimsSchema\":[{\"Source\":\"user\",\"ID\":\"department\",\"JwtClaimType\":\"department\"},{\"Source\":\"user\",\"ID\":\"companyname\",\"JwtClaimType\":\"companyname\"}]}}"
    ],
 "displayName": "ExtraClaimsTest"
}

将策略分配给资源服务主体

以下请求将声明映射策略分配给服务主体。 成功的响应将 204 No Content返回 。

POST https://graph.microsoft.com/v1.0/servicePrincipals/3bdbbc1a-5e94-4c2b-895f-231d8af4beee/claimsMappingPolicies/$ref
Content-type: application/json

{
 "@odata.id": "https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/06d5d20d-2955-45f8-a15d-cf2f434b8116"
}

在资源应用程序对象中启用映射声明

更新应用程序对象以接受映射声明并使用访问令牌版本 2。 成功的响应将 204 No Content返回 。

PATCH https://graph.microsoft.com/v1.0/applications/3dfbe85f-2d14-4660-b1a2-cb9c633ceebb
Content-type: application/json

{
  "api": {
    "acceptMappedClaims": true,
    "requestedAccessTokenVersion": 2
  }
}

测试访问令牌

在允许你遵循 Microsoft 标识平台 和 OAuth 2.0 授权代码流的 API 客户端中,获取访问令牌。 在 scope 参数中,包括资源服务主体公开的范围之一,例如 openid profile email scope-defined-by-your-api ,可能为 scope-defined-by-your-apiapi://00001111-aaaa-2222-bbbb-3333cccc4444/test

使用 jwt.ms 解码访问令牌。 声明 department 应出现在令牌中。

清理资源

若要从服务主体取消分配声明映射策略,请使用以下请求。 成功的响应将 204 No Content返回 。

DELETE https://graph.microsoft.com/v1.0/servicePrincipals/3bdbbc1a-5e94-4c2b-895f-231d8af4beee/claimsMappingPolicies//06d5d20d-2955-45f8-a15d-cf2f434b8116/$ref