【发布时间】: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