我的目标是在使用Azure
/oauth2/v2.0/token
端点上的客户端凭据流请求令牌时,在jwt令牌声明中包含来自client_app的信息。这是一个令牌请求:
POST /<tenant id>/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=<Application ID of client_app>
&client_secret=<secret of client_app>
&scope=<Application ID URI of main_app + "/.default">
&grant_type=client_credentials
令牌请求的响应是一个有效的令牌,其中包括roles
(从main_app授予给client_app的应用程序角色),aud
,sub
和idtype: app
声明。 但我的可选声明丢失了。
MS docs指出,使用目录扩展可以包括可选声明。
模式和开放扩展不支持可选声明,只有 AAD-Graph 风格的目录扩展支持该功能。此功能可用于附加您的应用可以使用的其他用户信息[...]
因此,我尝试将目录扩展添加到我的 main_app (extension_<main_app ID>_someAttrName
),向 main_app 添加了一个可选声明,并在 client_app 中存储了这个目录扩展的值。 不幸的是,扩展值未反映在令牌中。
我尝试在client_app本身上添加目录扩展名(extension_<client_app ID>_someAttrName
),并使用ClaimsMappingPolicy将目录扩展名映射到main_app。不幸的是,扩展值没有反映在令牌中。
在我看来,这些声明缺失了,因为它们不是来自用户对象。MS文档提供了很多添加可选声明的信息,但大多数情况涉及用户。例如,清单的可选声明source
属性:
据我了解,仅支持声明的源(目录对象)。有预定义的声明和来自扩展属性的用户定义的声明。如果源值为null,则声明是预定义的可选声明。如果源值为用户,则名称属性中的值是来自用户对象的扩展属性。
null
和"user"
。我想包括源自应用程序注册(client_app)的目录扩展名。由于我必须使用客户端凭据流(服务器到服务器),因此没有用户参与。
那么,在使用客户端凭据流时,如何向令牌添加自定义可选声明,而不涉及任何用户对象?有一个应用程序对象参与其中。那么,我需要如何配置声明才能反映自定义应用程序数据(例如,目录扩展名)?
main_app的清单:
{
"id": "<main_app ID>",
"acceptMappedClaims": true,
"accessTokenAcceptedVersion": 2,
"appId": "<main_app APP ID>",
"appRoles": [{
"allowedMemberTypes": ["Application"],
"isEnabled": true,
"origin": "Application",
"value": "readAll"
},{
"allowedMemberTypes": ["Application"],
"isEnabled": true,
"origin": "Application",
"value": "writeAll"
}],
"identifierUris": ["api://<main_app ID>"],
"optionalClaims": {
"idToken": [],
"accessToken": [ {
"name": "extension_<main_app ID>_someAttrName",
"source": "application", <-- propably invalid, "user" or null is supported
"essential": false,
"additionalProperties": []
}, { ... }
],
},
} /# trunced for readability
客户端应用的清单:
{
"id": "<client_app ID>",
"accessTokenAcceptedVersion": null,
"appId": "<client_app APP ID>",
"passwordCredentials": [{...}],
"extension_<main_app ID>_someAttrName": "some-string-value"
} /# trunced for readability
我的ClaimsMappingPolicy 定义
如下:
"ClaimsMappingPolicy": { "Version": 1, "IncludeBasicClaimSet": "true",
"ClaimsSchema": [ {
"Source": "application",
"ExtensionID": "extension_<client_app ID>_someAttrName",
"JwtClaimType": "someAttrName"
} ]
}