【问题标题】:Managed Identites and AppRoles in Token令牌中的托管身份和应用角色
【发布时间】:2021-12-05 11:33:59
【问题描述】:

我有一个名为“BackEnd_API”的 Web API“应用程序注册”,它定义了一些应用程序角色和用户角色。

    {
        "allowedMemberTypes": [
            "Application"
        ],
        "description": "resource.READ allows you read access to all items in the application",
        "displayName": "resource.READ",
        "id": "9650cfb9-570d-4b79-1337-a01337ed6c29",
        "isEnabled": true,
        "lang": null,
        "origin": "Application",
        "value": "resource.READ"
    },

然后我有另一个名为“Client_App”的客户端应用程序“应用程序注册”,它使用我使用 Azure_CLI 或 PowerShell 为其分配了 AppRoles“resource.READ”的 API。 在 Azure 门户中,我可以看到为服务主体分配了该角色。 当我使用 Client_Credentials 流时,生成的访问令牌确实包含我在后端使用的角色声明来授权调用者。 直到这里都很好。

现在,我想使用托管身份从另一个使用应用程序使用相同的 Web API“BackEnd_API”。因此,我创建了另一个“应用服务”,启用了系统分配标识并使用 Azure CLI 分配了 AppRoles“resource.READ”。 在 Azure 门户中,我可以看到为服务主体分配了角色。

我可以使用 JS Azure SDK 获得一个 Token。

var withClientSecretCredential = () => {
    require("@azure/core-auth");
    require('dotenv').config()
    const {
        ManagedIdentityCredential
    } = require("@azure/identity");
    const logger = require('@azure/logger');
    logger.setLogLevel('info');

    // Load the .env file if it exists
    const credentials = new ChainedTokenCredential(

    new ManagedIdentityCredential("54e5c672-872f-4866-b067-132973cb0c91"),
);

token = credentials.getToken(['api://e22fd9eb-3088-4155-936a-0919681c3eb5/.default']);
return token

但在这种情况下接收到的令牌没有“角色”声明,因此 API 调用无法授权。

我仔细检查了角色和分配,一切看起来都不错;这应该有效吗?

没有“角色”声明的令牌。

{ "aud": "e22fd9eb-3088-4155-936a-0919681c3eb5", "iss": "https://login.microsoftonline.com/45591230-6e37-4be7-acfb-4c9e23b261ea/v2.0", “iat”:1634550153, “nbf”:1634550153, “exp”:1634636853, "aio": "E2ZgYGguYd9fNkv3pOV5Iduv2655AgA=", "azp": "7dd894ca-6c1b-45ae-b67c-75db99593a14", “阿兹帕克”:“2”, "oid": "54e5c672-872f-4866-b067-132973cb0c91", "rh": "0.ARAAYH9ZRTdu50us-0yeI7Jh6sqU2H0bbK5Ftnx125lZOhQQAAA.", “子”:“54e5c672-872f-4866-b067-132973cb0c91”, "tid": "45597f60-6e37-4be7-acfb-4c9e23b261ea", “uti”:“qOLzTFlmw0yuWeFXXT1pAA”, “版本”:“2.0” }

感谢您的帮助。

【问题讨论】:

  • 是的,它应该可以工作。那么54e5c672-872f-4866-b067-132973cb0c91 是托管标识的appid/client_id 吗?
  • 是的,正是为应用服务托管标识创建的服务主体的 objectID。
  • 它不应该是objectid,而是appid/client_id。查看文档,您只需为用户分配的身份传递 clientId。您是否尝试过不通过 clientId ? docs.microsoft.com/en-us/javascript/api/@azure/identity/…
  • @Thomas,你是对的,使用 Application_ID 而不是 Object_ID 我在令牌中获得了角色声明。

标签: azure-active-directory azure-web-app-service azure-managed-identity azure-webapps azure-identity


【解决方案1】:

您可能获得的令牌应该是访问令牌,而您要查找的角色应该在 id 令牌中。您是否通过在 azure 门户中启用“ID 令牌”来尝试此操作?

【讨论】:

猜你喜欢
  • 2014-07-27
  • 1970-01-01
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2022-12-03
  • 1970-01-01
相关资源
最近更新 更多