使用 Microsoft Graph 自定义声明策略(预览版)来自定义声明

“声明”是标识提供者在为某个用户颁发的令牌中陈述的有关该用户的信息。 租户管理员使用声明自定义为其租户中的特定应用程序自定义令牌中发出的声明。 声明自定义支持使用 SAML、OAuth 和 OpenID Connect 协议为应用程序配置声明。 可以使用声明自定义来执行以下操作:

  • 选择在令牌中包含的声明。
  • 创建尚不存在的声明类型。
  • 选择或更改在特定声明中发出的数据的源。

在本操作指南中,我们介绍了几种常见情况,以帮助你了解如何使用自定义声明策略

先决条件

Microsoft Entra ID 中的声明自定义

Microsoft Entra ID 支持通过两种方式使用 Microsoft Graph/PowerShell 为应用程序自定义声明:

在以下示例中,我们为服务主体创建、更新和替换策略。 自定义声明策略始终与服务主体对象相关联。 在为应用程序/服务主体创建自定义声明策略之前,请确保已将企业应用程序配置为先决条件的一部分。

在浏览器中打开 Microsoft Graph 浏览器,至少以应用程序管理员的身份登录 Microsoft Graph 浏览器,然后选择以下方案之一。

创建自定义声明策略后,应将应用程序配置为承认令牌包含自定义的声明。 有关详细信息,请参阅安全注意事项

省略令牌中的基本声明

在此示例中,我们创建一个自定义声明策略,该策略会从颁发给链接的服务主体的令牌中删除基本声明集

  1. 在 Microsoft Graph 浏览器中,确定你要使用服务主体 API 为其配置自定义声明策略的应用程序。

  2. 通过运行以下 API 创建自定义声明策略。 该策略与服务主体相链接,省略了来自令牌的基本声明。

    PUT https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    请求正文:

    {
        "includeBasicClaimSet": false
    }
    
  3. 若要查看新策略,请运行以下命令

    GET https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    响应:

    HTTP/1.1 200 OK
    Content-type: application/json
    
    {
        "@odata.context": "…",
        "id": "aaaaaaaa-bbbb-cccc-1111-222222222222.",
        "includeBasicClaimSet": false,
        "includeApplicationIdInIssuer": false,
        "audienceOverride": null,
        "groupFilter": null,
        "claims": []
    }
    

在令牌中包含 EmployeeIDTenantCountry 以作为声明

在此示例中,我们创建针对声明的自定义,以将 EmployeeIDTenantCountry 添加到令牌中。 在此示例中,我们还在令牌中包含基本声明集。

  1. 在 Microsoft Graph 浏览器中,确定你要使用服务主体 API 为其配置自定义声明策略的应用程序。

  2. 通过运行以下 API 创建自定义声明策略。 此策略(链接到服务主体)向令牌添加 EmployeeID 和 TenantCountry 声明。

    PUT https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    请求正文:

    {
        "includeBasicClaimSet": true,
        "claims": [
            {
                "@odata.type": "#microsoft.graph.customClaim",
                "name": "employeeId",
                "namespace": null,
                "tokenFormat": [
                    "jwt"
                ],
                "samlAttributeNameFormat": null,
                "configurations": [
                    {
                        "condition": null,
                        "attribute": {
                            "@odata.type": "#microsoft.graph.sourcedAttribute",
                            "id": " employeeid",
                            "source": "user",
                            "isExtensionAttribute": false
                        },
                        "transformations": []
                    }
                ]
            },
            {
                "@odata.type": "#microsoft.graph.customClaim",
                "name": "country",
                "namespace": null,
                "tokenFormat": [
                    "jwt"
                ],
                "samlAttributeNameFormat": null,
                "configurations": [
                    {
                        "condition": null,
                        "attribute": {
                            "@odata.type": "#microsoft.graph.sourcedAttribute",
                            "id": " tenantcountry",
                            "source": "user",
                            "isExtensionAttribute": false
                        },
                        "transformations": []
                    }
                ]
            }
        ]
    }
    
  3. 若要查看新策略,请运行以下命令:

    GET https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    响应:

    {
        "@odata.context": "…",
        "id": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "includeBasicClaimSet": true,
        "includeApplicationIdInIssuer": false,
        "audienceOverride": null,
        "groupFilter": null,
        "claims": [...]
    }
    

在令牌中使用声明转换

在此示例中,我们更新一个策略,以便向颁发给链接的服务主体的 JWT 发出自定义声明“JoinedData”。 此声明包含通过在用户对象的 extensionattribute1 属性中存储的数据后联接“-ext”后创建的值。 在此示例中,我们在令牌中排除基本声明集。

  1. 在 Microsoft Graph 浏览器中,确定你要使用服务主体 API 为其配置自定义声明策略的应用程序。

  2. 通过运行以下 API 创建自定义声明策略。 此策略向令牌发出自定义声明 JoinedData

    PATCH https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    请求正文:

    {
        "includeBasicClaimSet": true,
        "claims": 
        [
            {
                "@odata.type": "#microsoft.graph.customClaim",
                "name": "JoinedData",
                "namespace": null,
                "tokenFormat": [
                    "jwt"
                ],
                "samlAttributeNameFormat": null,
                "configurations": 
                [
                    {
                        "condition": null,
                        "attribute": null,
                        "transformations": 
                        [
                            {
                                "@odata.type": "#microsoft.graph.joinTransformation",
                                "separator": "-",
                                "input": 
                                {
                                    "treatAsMultiValue": false,
                                    "attribute": 
                                    {
                                        "@odata.type": "#microsoft.graph.sourcedAttribute",
                                        "id": "extensionattribute1",
                                        "source": "user",
                                        "isExtensionAttribute": false
                                    }
                                },
                                "input2": 
                                {
                                    "treatAsMultiValue": false,
                                    "attribute": 
                                    {
                                        "@odata.type":"#microsoft.graph.valueBasedAttribute",
                                        "value": "ext"
                                     }
                                }
                            }
                        ]
                    }
                ]
            }
        ]
    }
    

    注意

    自定义声明策略是一种强类型策略,每个转换都使用不同的 @odata.type 值。

  3. 要查看新策略并获取策略 ObjectId,请运行以下命令:

    GET https://graph.microsoft.com/beta/servicePrincipals/<servicePrincipal-id>/claimsPolicy
    

    响应:

    {
        "@odata.context": "…",
        "id": "aaaaaaaa-bbbb-cccc-1111-222222222222",
        "includeBasicClaimSet": true,
        "includeApplicationIdInIssuer": false,
        "audienceOverride": null,
        "groupFilter": null,
        "claims": [...]
    }