Microsoft Entra可验证凭据管理API客户端凭据签发问题
解决Microsoft Entra可验证凭据管理API的客户端凭据问题
针对你遇到的两个错误,以下是具体的原因分析和解决方案:
1. 受众无效错误
错误提示API期望的受众是0135fd85-3010-4e73-a038-12560d2b58a9,6a8b4b39-c021-437c-b060-5a14a3fd65f3,你之前的请求错误地使用了角色ID(6a8b4b39开头的字符串)作为scope前缀,而正确的应该使用管理API的资源ID。
修正后的OAuth2令牌请求
使用旧的oauth2/token端点时,替换scope参数为resource(指定API的资源ID):
GET https://login.microsoftonline.com/<tenant_id>/oauth2/token Query Params: client_id=<client_id> client_secret=<client_secret> resource=0135fd85-3010-4e73-a038-12560d2b58a9 grant_type=client_credentials
2. 令牌无wids未授权错误
wids是用户角色的标识声明,客户端凭据流(应用身份)的令牌中不会包含该字段,API实际验证的是应用是否被分配了对应的角色权限。你之前的错误是因为scope未关联到正确的API资源,且需确保角色分配正确生效。
修正步骤:
- 确认角色分配:在Azure门户的Microsoft Entra ID→角色和管理员中,找到「Verifiable Credentials Service Admin」角色,添加分配并选择你的应用注册,等待5-10分钟让分配生效。
- 修正MSAL代码:使用API的资源URI作为scope,而不是角色ID:
var app = ConfidentialClientApplicationBuilder.Create("<client_id>") .WithClientSecret("<client_secret>") .WithAuthority(new Uri("https://login.microsoftonline.com/<tenant_id>")) .Build(); var result = await app.AcquireTokenForClient(new string[] { "https://verifiedid.did.msidentity.com/.default" }).ExecuteAsync(); Console.WriteLine("Access Token: {0}", result.AccessToken);
核心原因说明
- 你混淆了角色ID和API资源ID:6a8b4b39开头的字符串是「Verifiable Credentials Service Admin」角色的ID,而0135fd85开头的是管理API的资源ID,获取令牌时必须关联到API资源ID才能让受众验证通过。
- 客户端凭据流中,应用的权限通过
roles声明体现,而非wids,正确配置scope和角色分配后,令牌会包含full_access的roles权限,API即可验证通过。
内容的提问来源于stack exchange,提问作者thenhawke
相关产品推荐
相关产品推荐

