gpt4 book ai didi

JWT 中的 Azure AD 自定义声明

转载 作者:行者123 更新时间:2023-12-03 14:32:48 25 4
gpt4 key购买 nike

我有一个 Azure AD 应用程序,我正在尝试向 JWT 添加自定义声明。我正在将 Azure 中的声明映射功能用于我的特定应用程序,并更新了 Azure 门户中的应用程序 list 以包含可选声明。但是,当我登录并查看解码的访问 token 时, token 中不存在该声明。我还没有找到太多与使用扩展属性作为声明相关的文档,但从我发现的情况来看,它应该遵循相同的模式,但它没有按预期工作。

当用户登录时,如何将源自 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"]
}
  • 将值写入特定 AD 用户的扩展程序
  • 请求:

    PATCH https://graph.windows.net/mytenant.onmicrosoft.com/users/<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c6b3b5a3b4f7f4f586abbfb2a3a8a7a8b2e8a9a8abafa5b4a9b5a9a0b2e8a5a9ab" rel="noreferrer noopener nofollow">[email protected]</a>?api-version=1.5

    正文:

    {
    "extension_<appId>_customUserRoles": "My Custom Role 1, Another Role 2"
    }
  • 在 PowerShell 中,我安装了 Azure AD 模块:Install-Module -Name AzureADPreview
  • 创建 Azure AD 策略
  • New-AzureADPolicy -Definition @('{"ClaimsMappingPolicy":{"Version": 1, "IncludeBasicClaimSet": "true", "
    ClaimsSchema": [ { "Source": "user", "ID": "extension_<appId>_customUserRoles", "JwtClaimType": "customUserRoles" } ] } }') -DisplayName "customUserRoles" -Type "ClaimsMappingPolicy"
  • 将策略添加到服务主体
  • Add-AzureADServicePrincipalPolicy -Id <service-principla-id> -RefObjectId <azure-ad-policy-id>
  • 在 Azure 门户中,导航到 Azure AD -> 应用注册 -> 我的应用 -> list
  • 更新以下属性
  • {
    ...
    "acceptMappedClaims: true,
    "optionalClaims": {
    "idToken": [
    {
    "name": "extension_<appId>_customUserRoles",
    "source": "user",
    "essential": false,
    }
    ],
    "accessToken": [
    {
    "name": "extension_<appId>_customUserRoles",
    "source": "user",
    "essential": false,
    }
    ],
    "samlToken": []
    }
    }
  • 保存文件
  • 导航至https://login.microsoftonline.com/mytenant.onmicrosoft.com/oauth2/authorize?client_id=<appId>&response_type=token&resource=https://mytenant.sharepoint.com并使用 Azure AD 用户帐户 <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0b7e786e793a39384b66727f6e656a657f256465666268796478646d7f25686466" rel="noreferrer noopener nofollow">[email protected]</a> 登录
  • 在 URL 中,复制 access_token 的值参数
  • 导航至https://jwt.ms并将访问 token 粘贴到文本区域
  • 在解码的 token 部分中,自定义声明customUserRoles存在
  • 我的期望是我应该看到一个名为 customUserRoles 的新声明或extn.customUserRoles在解码的 token 中。

    我缺少哪些步骤?在整个过程中我没有遇到任何错误,但它似乎并不像文档所建议的那样工作。

    <小时/>

    引用资料

    我已阅读有关这些主题的 Microsoft 文档:

    可选声明:https://learn.microsoft.com/en-us/azure/active-directory/develop/active-directory-optional-claims

    claim 映射: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

    最佳答案

    基于this official文档:

    Access tokens are always generated using the manifest of the resource, not the client. So in the request ...scope=https://graph.microsoft.com/user.read... the resource is Graph. Thus, the access token is created using the Graph manifest, not the client's manifest. Changing the manifest for your application will never cause tokens for Graph to look different. In order to validate that your accessToken changes are in effect, request a token for your application, not another app.

    根据您的要求,如果您想对访问 token 进行一些更改(该资源是Sharepoint Online,这是由MSFT创建和管理的 Multi-Tenancy 应用程序),这是不可能的。

    对于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>'

    token 结果: enter image description here

    此外,请注意extension_<appId>_customUserRoles不是有效的用户源 ID 。所有有效的用户来源ID,请引用here .

    希望有帮助。

    关于JWT 中的 Azure AD 自定义声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940576/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com