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