我在 Azure 中执行了“公开 API”,但无法将该范围的令牌提供给客户端程序
Posted
技术标签:
【中文标题】我在 Azure 中执行了“公开 API”,但无法将该范围的令牌提供给客户端程序【英文标题】:I did the "Expose an API" in Azure but cannot get the token for that scope to a client program 【发布时间】:2020-08-06 01:27:55 【问题描述】:我正在尝试构建 WebAPI,并希望使用范围来限制其他客户端应用程序的权限。我在 Expose an API 刀片上创建了一个范围“BuildingAccess”,并将其他客户端应用程序添加到具有该范围的授权列表中。但是,当我使用客户端程序尝试获取具有该范围的令牌时,我收到“AADSTS70011: The provided request must include a 'scope' input parameter. The provided value for the input parameter 'scope' is not valid.
”错误
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create("removed")
.WithTenantId("removed")
.WithClientSecret(ClientSecret)
.Build();
List<string> scopes = new List<string>();
scopes.Add(".default");
scopes.Add("https://localhost:44371/BuildingAccess");
AuthenticationResult result = null;
try
result = await app.AcquireTokenForClient(scopes).ExecuteAsync();
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine("Token acquired \n");
Console.ResetColor();
catch (MsalServiceException ex)
when (ex.Message.Contains("AADSTS70011"))
// Invalid scope. The scope has to be of the form "https://resourceurl/.default"
// Mitigation: change the scope to be as expected
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("Scope provided is not supported");
Console.ResetColor();
似乎唯一可行的格式是范围设置为https://localhost:44371/.default。下面我添加 BuildingAccess 范围的所有其他组合都失败,并出现以下错误,我尝试过的不同格式。
范围api://333333-2222-1111-0000-aaaaaaaaaaaaa/BuildingAccess https://localhost:44371/.default
无效。
范围api://333333-2222-1111-0000-aaaaaaaaaaaaa/.default api://333333-2222-1111-0000-aaaaaaaaaaaaa/BuildingAccess
无效。
范围.default BuildingAccess
无效。
范围BuildingAccess
无效。
范围api://333333-2222-1111-0000-aaaaaaaaaaaaa/BuildingAccess
https://localhost:44371/BuildingAccess
范围无效。
如果是https://localhost:44371/.default
,那么我的服务器端有一个错误,因为它失败了
抛出异常: 'Microsoft.IdentityModel.Tokens.SecurityTokenInvalidAudienceException' 在 Microsoft.IdentityModel.Tokens.dll 中
我在客户端收到未经授权的响应。
【问题讨论】:
【参考方案1】:问题是我需要获得管理员同意才能使应用程序权限工作。这是对我所在的 Azure 租户的限制操作,所以我不能这样做。
【讨论】:
【参考方案2】:1.请输入正确的格式范围,确保使用以下格式:api://Your-Application-ID/your_scope_name。
2.然后您应该授予API权限并选择管理员同意。
【讨论】:
第 1 点很好。我尝试了所有的组合都没有成功,这是我帖子的底部。对于 2. 我想知道我的问题是否是我无法为我的组织授予管理员同意。这似乎是一种受限制的特权。我想我可以通过在我的 appregistration 中将客户端应用程序添加为“授权客户端应用程序”并在执行此操作时为它们提供 BuildingAccess 范围来解决此问题。 好的,我与另一位开发人员确认了该问题。问题是管理员同意是一个受限制的权限,我需要它才能使其工作。以上是关于我在 Azure 中执行了“公开 API”,但无法将该范围的令牌提供给客户端程序的主要内容,如果未能解决你的问题,请参考以下文章
Azure Active Directory 令牌在 JWT 中缺少应用角色