可能是愚蠢的问题,但我无论如何都会问 - 在通过使用客户端凭据流调用 entra id 令牌端点生成令牌时,有没有办法将自定义数据添加到访问令牌? 客户端调用时类似于伪代码 https://login.microsoftonline.com/xxx/oauth2/v2.0/token 身体={ myCustomValue:“随便” } 我会收到一个令牌,它会神奇地包含一个价值为“无论什么”的声明......
感谢您的任何意见
请注意,不支持向使用客户端凭据流生成的令牌添加自定义声明。请参阅 Shweta Mathur 的 MS 问答。
或者,切换到委托流程,例如授权码流程或交互流程,其中用户需要至少登录一次。
首先,通过运行以下示例 Microsoft Graph PowerShell 脚本创建一个声明映射策略并获取其策略 ID:
#Install-Module Microsoft.Graph
Connect-MgGraph -Scopes "Policy.ReadWrite.ApplicationConfiguration,Policy.ReadWrite.ConditionalAccess,Policy.Read.All,Application.ReadWrite.All,User.ReadWrite.All"
$policyDefinition = @{
definition = '{
"ClaimsMappingPolicy": {
"Version": 1,
"IncludeBasicClaimSet": true,
"ClaimsSchema": [
{"Source": "user", "ID": "extensionattribute1", "SamlClaimType": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/myCustomValue", "JwtClaimType": "myCustomValue"}
]
}
}'
displayName = "CustomClaim"
}
$Policy = New-MgPolicyClaimMappingPolicy -BodyParameter $policyDefinition
Get-MgPolicyClaimMappingPolicy -ClaimsMappingPolicyId $Policy.Id | fl
回复:
现在,将此策略分配给您使用以下命令生成令牌的服务主体:
$servicePrincipalId = "spObjectId"
$policyId = "policyId"
$params = @{
"@odata.id" = "https://graph.microsoft.com/v1.0/policies/claimsMappingPolicies/$policyId"
}
New-MgServicePrincipalClaimMappingPolicyByRef -ServicePrincipalId $servicePrincipalId -BodyParameter $params
Get-MgServicePrincipalClaimMappingPolicy -ServicePrincipalId $servicePrincipalId | fl
回复:
现在,通过运行以下命令更新用户属性中的myCustomValue 声明值:
$userId = "userId"
$params = @{
onPremisesExtensionAttributes = @{
extensionAttribute1 = "myOwnValue"
}
}
Update-MgUser -UserId $userId -BodyParameter $params
在您的应用程序注册中,公开 API 并在其中添加 自定义范围,如下所示:
确保在应用程序注册清单中启用以下设置:
在生成访问令牌之前,不要错过添加并同意自定义 API 权限,如下所示:使用授权代码生成访问令牌时,请确保使用
scope 值作为 api://appId/access_as_user。
授权请求:
https://login.microsoftonline.com/tenantId/oauth2/v2.0/authorize?
client_id=appId
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=api://appId/access_as_user
&state=12345
令牌请求:
POST https://login.microsoftonline.com/tenantId/oauth2/v2.0/token
client_id:appId
client_secret:secret
grant_type:authorization_code
scope: api://appId/access_as_user
code:code
redirect_uri: https://jwt.ms
当我在 jwt.ms 网站中解码上述令牌时,其中有 自定义声明,如下所示:
参考: