我做了一件事;公开API“;在Azure中,但无法将该作用域的令牌获取到客户端程序

我做了一件事;公开API“;在Azure中,但无法将该作用域的令牌获取到客户端程序,azure,webapi,scopes,azure-authentication,Azure,Webapi,Scopes,Azure Authentication,我正在尝试构建WebAPI,并希望使用作用域来限制其他客户端应用程序的权限。我在ExposeanAPI刀片服务器上创建了一个作用域“BuildingAccess”,并将另一个客户端应用程序添加到具有该作用域的授权列表中。但是,当我使用客户端程序尝试获取具有该作用域的令牌时,我会得到“AADSTS70011:提供的请求必须包含“scope”输入参数。为输入参数“scope”提供的值无效。”错误 IConfidentialClientApplicationApp=SecretentialClient

我正在尝试构建WebAPI,并希望使用作用域来限制其他客户端应用程序的权限。我在ExposeanAPI刀片服务器上创建了一个作用域“BuildingAccess”,并将另一个客户端应用程序添加到具有该作用域的授权列表中。但是,当我使用客户端程序尝试获取具有该作用域的令牌时,我会得到“
AADSTS70011:提供的请求必须包含“scope”输入参数。为输入参数“scope”提供的值无效。
”错误

IConfidentialClientApplicationApp=SecretentialClientApplicationBuilder.Create(“已删除”)
.WithTenantId(“删除”)
.WithClientSecret(ClientSecret)
.Build();
列表范围=新列表();
添加(“.default”);
作用域。添加(“https://localhost:44371/BuildingAccess");
AuthenticationResult=null;
尝试
{
结果=等待app.AcquireTokenForClient(scopes.ExecuteAsync();
Console.ForegroundColor=ConsoleColor.Green;
Console.WriteLine(“已获取令牌”);
Console.ResetColor();
}
捕获(MsalServiceException ex)
当(例如消息包含(“AADSTS70011”))
{
//作用域无效。作用域的格式必须为“https://resourceurl/.default"
//缓解措施:将范围更改为预期范围
Console.ForegroundColor=ConsoleColor.Red;
Console.WriteLine(“不支持提供的范围”);
Console.ResetColor();
}
唯一有效的格式是将范围设置为。下面我添加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
    无效
  • 作用域
    。默认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.您应该输入正确的格式范围,确保使用以下格式:api://{Your Application ID}/Your\u scope\u name

2.然后您应该向API授予权限,并选择要同意的管理员。

问题是我需要获得管理员同意,才能使用应用到应用的权限。这是对我所在的Azure租户的限制性操作,因此我不能这样做。

对于第1点,这是一个很好的例子。我尝试了所有的组合,但都没有成功,这是我文章的底部。两个人。我想知道我的问题是我不能为我的组织授予管理员许可。这似乎是一种受限制的特权。我想通过在我的appregistration中将客户机应用程序添加为“授权客户机应用程序”并在这样做时给他们BuildingAccess范围来解决这个问题。好的,我与另一个开发人员确认了这个问题。问题是,管理员同意是一个限制性的许可,我需要它,以使这项工作。
 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();
        }