API использования биллинга Azure возвращает 401 несанкционированный
Я использую API-интерфейс REST Azure для получения сведений об использовании счетов и тарифных карт. Чтобы получить токен с помощью метода AcquireToken(), изначально я использовал только Client Id, который затем запрашивает учетные данные пользователя в окне входа в систему.
Однако я ищу неинтерактивный подход, поэтому я использовал учетные данные клиента, в которых передал идентификатор клиента и секретный ключ клиента.
Но это дает "Удаленный сервер возвращает ошибку 401 Несанкционированный"
Когда я глубоко заглядываю в ошибку, я обнаружил, что она выдает ошибку "Маркер доступа от неправильной аудитории или ресурса"
Пожалуйста, дайте мне любое решение, с помощью которого я могу получить доступ к API без какого-либо взаимодействия с пользователем.
Заранее спасибо.
Вот мой код:
{
string token = GetOAuthTokenFromAAD();
string requestURL = String.Format("{0}/{1}/{2}/{3}",
ConfigurationManager.AppSettings["ARMBillingServiceURL"],
"subscriptions",
ConfigurationManager.AppSettings["SubscriptionID"],
"providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId eq 'MS-AZR-*****' and Currency eq 'INR' and Locale eq 'en-IN' and RegionInfo eq 'IN'");
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestURL);
request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token);
request.ContentType = "application/json";
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Console.WriteLine(String.Format("RateCard service response status: {0}", response.StatusDescription));
}
public static string GetOAuthTokenFromAAD()
{
AuthenticationContext authenticationContext = new AuthenticationContext(string.Format("{0}/{1}",ConfigurationManager.AppSettings["ADALServiceURL"], ConfigurationManager.AppSettings["TenantDomain"]));
AuthenticationResult result = null;
ClientCredential uc = new ClientCredential(Client_Id, Secret_Key);
try
{
result = authenticationContext.AcquireToken("https://management.core.windows.net/", uc);
}
return result.AccessToken;
}
//App Config File
<add key="ADALServiceURL" value="https://login.microsoftonline.com" />
<add key="ADALRedirectURL" value="http://*****-authentication.cloudapp.net" />
<add key="ARMBillingServiceURL" value="https://management.core.windows.net" />
<add key="TenantDomain" value="********.onmicrosoft.com" />
<add key="SubscriptionID" value="*******-****-****-****-********" />
<add key="ClientId" value="*******-****-****-****-********" />
1 ответ
Обновление: я также предоставил эти методы в качестве библиотеки классов вспомогательной аутентификации многократного использования. Вы можете найти то же самое по этой ссылке: Аутентификация Azure - Аутентификация любого запроса API Azure в вашем приложении
Метод 1: Чтобы использовать подход с использованием пароля без интерактивного доступа, сначала необходимо выполнить следующий раздел "Проверка подлинности с помощью пароля - PowerShell": проверка подлинности субъекта службы с помощью ARM
Затем используйте приведенный ниже фрагмент кода для получения токена.
var authenticationContext = new AuthenticationContext(String.Format("{0}/{1}",
ConfigurationManager.AppSettings["ADALServiceURL"],
ConfigurationManager.AppSettings["TenantDomain"]));
var credential = new ClientCredential(clientId: "11a11111-11a1-111a-a111-1afeda2bca1a", clientSecret: "passwordhere");
var result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", clientCredential: credential);
if (result == null)
{
throw new InvalidOperationException("Failed to obtain the JWT token");
}
string token = result.AccessToken;
return token;
В качестве альтернативы (метод 2), вы также можете использовать метод сертификата. В этом случае используйте ту же ссылку, что и выше, но следуйте разделу "Аутентификация с сертификатом - PowerShell" из этой ссылки. Затем используйте приведенный ниже фрагмент кода, чтобы получить токен неинтерактивно:
var subscriptionId = "1a11aa11-5c9b-4c94-b875-b7b55af5d316";
string tenant = "1a11111a-5713-4b00-a1c3-88da50be3ace";
string clientId = "aa11a111-1050-4892-a2d8-4747441be14d";
var authContext = new AuthenticationContext(string.Format("https://login.windows.net/{0}", tenant));
X509Certificate2 cert = null;
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
string certName = "MyCert01";
try
{
store.Open(OpenFlags.ReadOnly);
var certCollection = store.Certificates;
var certs = certCollection.Find(X509FindType.FindBySubjectName, certName, false);
//var certs = certCollection.Find(X509FindType.FindBySerialNumber, "E144928868B609D35F72", false);
if (certs == null || certs.Count <= 0)
{
throw new Exception("Certificate " + certName + " not found.");
}
cert = certs[0];
}
finally
{
store.Close();
}
var certCred = new ClientAssertionCertificate(clientId, cert);
var token = authContext.AcquireToken("https://management.core.windows.net/", certCred);
var creds = new TokenCloudCredentials(subscriptionId, token.AccessToken);
//var client = new ResourceManagementClient(creds);
return token.AccessToken;