在 C# 应用程序中使用 Azure REST API 显示无响应
Consuming Azure REST API in C# application shows no response
当我在 azure docs post man 上尝试 azure rest api url 时,我能够得到一个包含所有资源组的 json。
https://docs.microsoft.com/en-us/rest/api/resources/resourcegroups/list#code-try-0a link
但我正在从 ASP.NET MVC 核心 C# 应用程序中尝试,我收到一个空数组。
public async Task<ResourceGroupModel> GetResourceGroupStatus()
{
ResourceGroupModel resourceGroupModel = null;
try
{
string requestUrlString = iconfiguration.GetValue<string>("HealthSettings:AzureGetResourcesBySubscriptionURL");
string azureSubscription = iconfiguration.GetValue<string>("HealthSettings:AzureSubscription");
string clientId = iconfiguration.GetValue<string>("HealthSettings:ClientId");
string tenantId = iconfiguration.GetValue<string>("HealthSettings:TenantId");
string clientSecret = iconfiguration.GetValue<string>("HealthSettings:ClientSecret");
Uri requestUrl = new Uri(requestUrlString.Replace("{subscriptionId}", azureSubscription));
string token = await GetAccessToken(tenantId, clientId, clientSecret);
_httpClient.DefaultRequestHeaders.Remove("Authorization");
_httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var response = _httpClient.GetAsync(requestUrl);
if (response.Result.IsSuccessStatusCode)
{
var data = response.Result.Content.ReadAsStringAsync();
resourceGroupModel = ResourceGroupModel.FromJson(data.Result.ToString());
}
}
catch (Exception ex)
{
}
return resourceGroupModel;
}
能否帮我摆脱 Azure REST 的奇怪行为 API。提前谢谢了。 :)
您的服务主体无权访问资源组。
- 登录 Azure 门户并select 资源组
- Select 来自 Blade
的访问控制 (IAM)
- 在“检查访问权限”选项卡上,添加角色分配
- 给你的服务主体一个角色 (Owner/Contributor/Reader)
- 将访问权限分配给:Azure AD 用户、组或服务主体
- 输入您的服务主体名称,搜索并select然后保存。
- 请稍等几分钟,然后再次尝试拨打您的 API。
正如 Ciubotariu 所说,您的服务主体无权访问资源组。但是,如果您只将服务主体添加到资源组,则只能获取指定的资源组。因此,将您的服务委托人添加到您的订阅。以下是步骤:
1.Go 到您的订阅,单击访问控制> 添加(添加角色分配)
2.Add 您的服务主体并为其分配角色,例如贡献者。
3.Then 您将获得订阅的所有资源组。
更新:
4.Here是我使用的完整代码:
var appId = "xxxxxxxxxxxxxxx";
var secretKey = "xxxxxxxxxxxxxxxxxxxxx";
var tenantId = "xxxxxxxxxxxxxxxxx";
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey);
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
var baseUrl = new Uri($"https://management.azure.com/");
var requestURl = baseUrl +
@"subscriptions/xxxxxxxxxxxxxxxx/resourcegroups?api-version=2019-05-01";
var response = client.GetAsync(requestURl).Result.Content.ReadAsStringAsync().Result;
}
删除现有的 clientsecret 并为服务原则创建新的 clientsecret 解决了这个问题。
当我在 azure docs post man 上尝试 azure rest api url 时,我能够得到一个包含所有资源组的 json。 https://docs.microsoft.com/en-us/rest/api/resources/resourcegroups/list#code-try-0a link
但我正在从 ASP.NET MVC 核心 C# 应用程序中尝试,我收到一个空数组。
public async Task<ResourceGroupModel> GetResourceGroupStatus()
{
ResourceGroupModel resourceGroupModel = null;
try
{
string requestUrlString = iconfiguration.GetValue<string>("HealthSettings:AzureGetResourcesBySubscriptionURL");
string azureSubscription = iconfiguration.GetValue<string>("HealthSettings:AzureSubscription");
string clientId = iconfiguration.GetValue<string>("HealthSettings:ClientId");
string tenantId = iconfiguration.GetValue<string>("HealthSettings:TenantId");
string clientSecret = iconfiguration.GetValue<string>("HealthSettings:ClientSecret");
Uri requestUrl = new Uri(requestUrlString.Replace("{subscriptionId}", azureSubscription));
string token = await GetAccessToken(tenantId, clientId, clientSecret);
_httpClient.DefaultRequestHeaders.Remove("Authorization");
_httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + token);
var response = _httpClient.GetAsync(requestUrl);
if (response.Result.IsSuccessStatusCode)
{
var data = response.Result.Content.ReadAsStringAsync();
resourceGroupModel = ResourceGroupModel.FromJson(data.Result.ToString());
}
}
catch (Exception ex)
{
}
return resourceGroupModel;
}
能否帮我摆脱 Azure REST 的奇怪行为 API。提前谢谢了。 :)
您的服务主体无权访问资源组。
- 登录 Azure 门户并select 资源组
- Select 来自 Blade 的访问控制 (IAM)
- 在“检查访问权限”选项卡上,添加角色分配
- 给你的服务主体一个角色 (Owner/Contributor/Reader)
- 将访问权限分配给:Azure AD 用户、组或服务主体
- 输入您的服务主体名称,搜索并select然后保存。
- 请稍等几分钟,然后再次尝试拨打您的 API。
正如 Ciubotariu 所说,您的服务主体无权访问资源组。但是,如果您只将服务主体添加到资源组,则只能获取指定的资源组。因此,将您的服务委托人添加到您的订阅。以下是步骤:
1.Go 到您的订阅,单击访问控制> 添加(添加角色分配)
2.Add 您的服务主体并为其分配角色,例如贡献者。
3.Then 您将获得订阅的所有资源组。
更新:
4.Here是我使用的完整代码:
var appId = "xxxxxxxxxxxxxxx";
var secretKey = "xxxxxxxxxxxxxxxxxxxxx";
var tenantId = "xxxxxxxxxxxxxxxxx";
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey);
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
var baseUrl = new Uri($"https://management.azure.com/");
var requestURl = baseUrl +
@"subscriptions/xxxxxxxxxxxxxxxx/resourcegroups?api-version=2019-05-01";
var response = client.GetAsync(requestURl).Result.Content.ReadAsStringAsync().Result;
}
删除现有的 clientsecret 并为服务原则创建新的 clientsecret 解决了这个问题。