JWT中的Azure AD自定义声明

hfsqlsce  于 2023-10-22  发布在  其他
关注(0)|答案(2)|浏览(106)

我有一个Azure AD应用程序,我正在尝试将自定义声明添加到JWT。我正在为我的特定应用程序使用Azure中的声明Map功能,并更新了Azure门户中的应用程序清单以包含可选声明。但是,当我登录并查看解码的访问令牌时,令牌中不存在声明。我还没有找到太多关于使用扩展属性作为声明的文档,但从我所发现的来看,它应该遵循相同的模式,但它并没有像预期的那样工作。
当用户登录时,如何将源自AD中用户对象中的自定义属性的自定义声明添加到JWT?
提前感谢!

重新创建步骤

1.使用Azure AD Graph API注册目录扩展名
要求:
POST https://graph.windows.net/mytenant.onmicrosoft.com/applications/<application-object-id>/extensionProperties?api-version=1.5
正文:

{
   "name": "customUserRoles",
   "dataType": "String",
   "targetObjects": ["User"]
}

1.将值写入特定AD用户的扩展
要求:
PATCH https://graph.windows.net/mytenant.onmicrosoft.com/users/ [[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection) ?api-version=1.5
正文:

{
   "extension_<appId>_customUserRoles": "My Custom Role 1, Another Role 2"
}

1.在PowerShell中,我安装了Azure AD模块:Install-Module -Name AzureADPreview
1.创建Azure AD策略

New-AzureADPolicy -Definition @('{"ClaimsMappingPolicy":{"Version": 1, "IncludeBasicClaimSet": "true", "
ClaimsSchema": [ { "Source": "user", "ID": "extension_<appId>_customUserRoles", "JwtClaimType": "customUserRoles" } ] } }') -DisplayName "customUserRoles" -Type "ClaimsMappingPolicy"

1.将策略添加到服务主体

Add-AzureADServicePrincipalPolicy -Id <service-principla-id> -RefObjectId <azure-ad-policy-id>

1.在Azure门户中,导航到Azure AD -> App Registrations -> My App -> Manifest
1.更新以下属性

{
   ...
   "acceptMappedClaims: true,
   "optionalClaims": {
      "idToken": [
         {
            "name": "extension_<appId>_customUserRoles",
            "source": "user",
            "essential": false,
         }
      ],
      "accessToken": [
         {
            "name": "extension_<appId>_customUserRoles",
            "source": "user",
            "essential": false,
         }
      ],
      "samlToken": []
   }
}

1.保存文件
1.导航到https://login.microsoftonline.com/mytenant.onmicrosoft.com/oauth2/authorize?client_id=<appId>&response_type=token&resource=https://mytenant.sharepoint.com并使用Azure AD用户帐户[[email protected]](https://stackoverflow.com/cdn-cgi/l/email-protection)登录
1.在URL中,复制access_token参数的值
1.导航到https://jwt.ms并将访问令牌粘贴到文本区域
1.在解码的令牌部分中,自定义声明 *customUserRoles不存在
我的期望是我应该在解码的令牌中看到一个名为customUserRolesextn.customUserRoles的新声明。
我错过了哪些步骤?在整个过程中,我没有遇到任何错误,但它似乎并不像文档所建议的那样工作。

参考资料

我已经阅读了Microsoft关于这些主题的文档:
可选权利要求:https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims
声明Map:https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-claims-mapping
我也读过与此相关的各种论坛帖子和博客文章:
https://devonblog.com/cloud/azure-ad-adding-employeeid-claims-in-azure-ad-jwt-token/
http://www.redbaronofazure.com/?p=7566
https://social.msdn.microsoft.com/Forums/en-US/3e5114b6-24d6-4c60-b72b-b4c90baeecac/access-token-missing-optional-claims-that-are-schema-extensions-implicit-grant-flow
https://social.msdn.microsoft.com/Forums/en-US/dbeeed63-8d3f-4c27-b416-431f9fe6c729/providing-directory-extension-optional-claims-and-returning-value-within-token?forum=WindowsAzureAD

m0rkklqb

m0rkklqb1#

根据这份官方文件:
访问令牌总是使用资源的清单而不是客户端生成的。所以在请求中...scope= https://graph.microsoft.com/user.read ...这个资源就是Graph。因此,访问令牌是使用Graph清单而不是客户端清单创建的。更改应用程序的清单永远不会导致Graph的令牌看起来不同。为了验证accessToken更改是否有效,请为您的应用请求令牌,而不是其他应用。
根据您的要求,如果您想对资源为SharePoint Online的访问令牌进行一些更改,这是不可能的,SharePoint Online是由MSFT创建和管理的多租户应用程序。
对于this doc,我也为你做了一些研究。同样,你应该控制服务端应用程序,这样你就可以实现这一点。
这是我的策略角色分配命令:

$nsp = New-AzureADPolicy -Definition @('{"ClaimsMappingPolicy":{"Version":1,"IncludeBasicClaimSet":"true", "ClaimsSchema": [{"Source":"user","ID":"mailnickname","JwtClaimType":"testclaim"}]}}') -DisplayName "StanCustomCliamDemo_surname" -Type "ClaimsMappingPolicy"

Add-AzureADServicePrincipalPolicy  -RefObjectId $nsp.Id -Id '<obj id of service side app>'

代币结果:

另外,请注意extension_<appId>_customUserRoles不是一个有效的用户源ID。所有有效的用户源ID,请参考这里。
希望有帮助。

3hvapo4f

3hvapo4f2#

几年后,这一点,但任何人来这在2023年。它没有特别好的文档记录,但是如果你想将extentionAttributeMap到JWT中,你需要在ClaimsSchema对象中使用属性ExtensionID,而不是ID
所以:

New-AzureADPolicy -Definition @('{"ClaimsMappingPolicy":{"Version": 1, "IncludeBasicClaimSet": "true", "ClaimsSchema": [ { "Source": "user", "ID": "extension_<appId>_customUserRoles", "JwtClaimType": "customUserRoles" } ] } }') -DisplayName "customUserRoles" -Type "ClaimsMappingPolicy"

变成:

New-AzureADPolicy -Definition @('{"ClaimsMappingPolicy":{"Version": 1, "IncludeBasicClaimSet": "true","ClaimsSchema": [ { "Source": "user", "ExtensionID": "extension_<appId>_customUserRoles", "JwtClaimType": "customUserRoles" } ] } }') -DisplayName "customUserRoles" -Type "ClaimsMappingPolicy"

相关问题