我在 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 中缺少应用角色

Specflow - 在 Azure 管道中执行多个测试项目,但 vstests 失败

REST/JSON:如何生成示例请求?如何公开 API?

在 Azure 中授予管理员同意

Azure 文件共享:无法映射网络驱动器

在Visual Studio 2013中进行调试时,Azure Compute Emulator无法启动,保持关闭状态