Jak używać tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej platformy Azure w celu uzyskania tokenu dostępu
Tożsamości zarządzane dla zasobów platformy Azure to funkcja identyfikatora Entra firmy Microsoft. Każda usługa platformy Azure obsługująca tożsamości zarządzane dla zasobów platformy Azure ma własną oś czasu. Pamiętaj, aby przed rozpoczęciem sprawdzić stan dostępności tożsamości zarządzanych dla swojego zasobu i znane problemy.
Tożsamości zarządzane dla zasobów platformy Azure udostępniają usługom platformy Azure automatycznie zarządzaną tożsamość w usłudze Microsoft Entra ID. Za pomocą tej tożsamości można uwierzytelnić się w dowolnej usłudze obsługującej uwierzytelnianie firmy Microsoft Entra bez konieczności posiadania poświadczeń w kodzie.
Ten artykuł zawiera różne przykłady kodu i skryptu na potrzeby pozyskiwania tokenów. Zawiera również wskazówki dotyczące obsługi wygasania tokenu i błędów HTTP.
Wymagania wstępne
- Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zobacz to omówienie. Jeśli nie masz jeszcze konta platformy Azure, przed kontynuowaniem utwórz bezpłatne konto.
Jeśli planujesz używać przykładów programu Azure PowerShell w tym artykule, pamiętaj, aby zainstalować najnowszą wersję programu Azure PowerShell.
Ważne
- Cały przykładowy kod/skrypt w tym artykule zakłada, że klient jest uruchomiony na maszynie wirtualnej z tożsamościami zarządzanymi dla zasobów platformy Azure. Użyj funkcji "Połączenie" maszyny wirtualnej w witrynie Azure Portal, aby zdalnie nawiązać połączenie z maszyną wirtualną. Aby uzyskać szczegółowe informacje na temat włączania tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej, zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu witryny Azure Portal lub jednego z artykułów wariantów (przy użyciu programu PowerShell, interfejsu wiersza polecenia, szablonu lub zestawu Azure SDK).
Ważne
- Granica zabezpieczeń tożsamości zarządzanych dla zasobów platformy Azure to zasób, w którym jest używana tożsamość. Wszystkie kod/skrypty uruchomione na maszynie wirtualnej mogą żądać i pobierać tokeny dla wszystkich dostępnych tożsamości zarządzanych.
Omówienie
Aplikacja kliencka może zażądać tokenu dostępu tylko do aplikacji tożsamości zarządzanej w celu uzyskania dostępu do danego zasobu. Token jest oparty na tożsamościach zarządzanych dla jednostki usługi zasobów platformy Azure. W związku z tym nie ma potrzeby, aby klient uzyskał token dostępu w ramach własnej jednostki usługi. Token jest odpowiedni do użycia jako token elementu nośnego w wywołaniach typu service-to-service wymagających poświadczeń klienta.
Łącze | opis |
---|---|
Uzyskiwanie tokenu przy użyciu protokołu HTTP | Szczegóły protokołu dla tożsamości zarządzanych dla punktu końcowego tokenu zasobów platformy Azure |
Uzyskiwanie tokenu przy użyciu usługi Azure.Identity | Uzyskiwanie tokenu przy użyciu biblioteki Azure.Identity |
Uzyskiwanie tokenu przy użyciu biblioteki Microsoft.Azure.Services.AppAuthentication dla platformy .NET | Przykład użycia biblioteki Microsoft.Azure.Services.AppAuthentication z klienta platformy .NET |
Uzyskiwanie tokenu przy użyciu języka C# | Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta języka C# |
Uzyskiwanie tokenu przy użyciu języka Java | Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta Java |
Uzyskiwanie tokenu przy użyciu języka Go | Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z klienta języka Go |
Uzyskiwanie tokenu przy użyciu programu PowerShell | Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta programu PowerShell |
Uzyskiwanie tokenu przy użyciu narzędzia CURL | Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta Bash/CURL |
Obsługa buforowania tokenów | Wskazówki dotyczące obsługi wygasłych tokenów dostępu |
Obsługa błędów | Wskazówki dotyczące obsługi błędów HTTP zwracanych z tożsamości zarządzanych dla punktu końcowego tokenu zasobów platformy Azure |
Identyfikatory zasobów dla usług platformy Azure | Gdzie uzyskać identyfikatory zasobów dla obsługiwanych usług platformy Azure |
Uzyskiwanie tokenu przy użyciu protokołu HTTP
Podstawowy interfejs uzyskiwania tokenu dostępu jest oparty na protokole REST, dzięki czemu jest dostępny dla dowolnej aplikacji klienckiej uruchomionej na maszynie wirtualnej, która może wykonywać wywołania REST PROTOKOŁU HTTP. Takie podejście jest podobne do modelu programowania Entra firmy Microsoft, z wyjątkiem tego, że klient używa punktu końcowego na maszynie wirtualnej (a punkt końcowy firmy Microsoft Entra).
Przykładowe żądanie przy użyciu punktu końcowego usługi Azure Instance Metadata Service (IMDS) (zalecane):
GET 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/' HTTP/1.1 Metadata: true
Element | opis |
---|---|
GET |
Czasownik HTTP wskazujący, że chcesz pobrać dane z punktu końcowego. W takim przypadku token dostępu OAuth. |
http://169.254.169.254/metadata/identity/oauth2/token |
Tożsamości zarządzane dla punktu końcowego zasobów platformy Azure dla usługi metadanych wystąpienia. |
api-version |
Parametr ciągu zapytania wskazujący wersję interfejsu API dla punktu końcowego USŁUGI IMDS. Użyj wersji 2018-02-01 interfejsu API lub nowszej. |
resource |
Parametr ciągu zapytania wskazujący identyfikator URI identyfikatora aplikacji zasobu docelowego. Pojawia się również w oświadczeniu aud (odbiorców) wystawionego tokenu. W tym przykładzie żądanie tokenu w celu uzyskania dostępu do usługi Azure Resource Manager, która ma identyfikator URI identyfikatora https://management.azure.com/ aplikacji . |
Metadata |
Pole nagłówka żądania HTTP wymagane przez tożsamości zarządzane. Te informacje są używane jako środki zaradcze w przypadku ataków fałszerskich żądań po stronie serwera (SSRF). Ta wartość musi być ustawiona na wartość "true", we wszystkich małych literach. |
object_id |
(Opcjonalnie) Parametr ciągu zapytania wskazujący object_id tożsamości zarządzanej, dla której chcesz utworzyć token. Wymagane, jeśli maszyna wirtualna ma wiele tożsamości zarządzanych przypisanych przez użytkownika. |
client_id |
(Opcjonalnie) Parametr ciągu zapytania wskazujący client_id tożsamości zarządzanej, dla której chcesz utworzyć token. Wymagane, jeśli maszyna wirtualna ma wiele tożsamości zarządzanych przypisanych przez użytkownika. |
msi_res_id |
(Opcjonalnie) Parametr ciągu zapytania wskazujący msi_res_id (identyfikator zasobu platformy Azure) tożsamości zarządzanej, dla której chcesz utworzyć token. Wymagane, jeśli maszyna wirtualna ma wiele tożsamości zarządzanych przypisanych przez użytkownika. |
Przykładowa odpowiedź:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi...",
"refresh_token": "",
"expires_in": "3599",
"expires_on": "1506484173",
"not_before": "1506480273",
"resource": "https://management.azure.com/",
"token_type": "Bearer"
}
Element | opis |
---|---|
access_token |
Żądany token dostępu. Podczas wywoływania zabezpieczonego interfejsu API REST token jest osadzony w Authorization polu nagłówka żądania jako token elementu nośnego, co umożliwia interfejsowi API uwierzytelnianie elementu wywołującego. |
refresh_token |
Nieużytowane przez tożsamości zarządzane dla zasobów platformy Azure. |
expires_in |
Liczba sekund, przez które token dostępu będzie nadal ważny przed wygaśnięciem, od czasu wystawienia. Czas wystawiania można znaleźć w oświadczeniu tokenu iat . |
expires_on |
Przedział czasu wygaśnięcia tokenu dostępu. Data jest reprezentowana jako liczba sekund od "1970-01-01T0:0:0Z UTC" (odpowiada oświadczenia tokenu exp ). |
not_before |
Przedział czasu, kiedy token dostępu ma obowiązywać i może zostać zaakceptowany. Data jest reprezentowana jako liczba sekund od "1970-01-01T0:0:0Z UTC" (odpowiada oświadczenia tokenu nbf ). |
resource |
Zasób zażądano tokenu dostępu, który odpowiada parametrowi resource ciągu zapytania żądania. |
token_type |
Typ tokenu, który jest tokenem dostępu "Bearer", co oznacza, że zasób może udzielić dostępu do elementu nośnego tego tokenu. |
Uzyskiwanie tokenu przy użyciu biblioteki klienta tożsamości platformy Azure
Korzystanie z biblioteki klienta tożsamości platformy Azure jest zalecanym sposobem korzystania z tożsamości zarządzanych. Wszystkie zestawy SDK platformy Azure są zintegrowane z biblioteką, która zapewnia obsługę parametru Azure.Identity
DefaultAzureCredential. Ta klasa ułatwia korzystanie z tożsamości zarządzanych za pomocą zestawów SDK platformy Azure.Dowiedz się więcej
Zainstaluj pakiet Azure.Identity i inne wymagane pakiety bibliotek zestawu Azure SDK, takie jak Azure.Security.KeyVault.Secrets.
Użyj poniższego przykładowego kodu. Nie musisz martwić się o uzyskiwanie tokenów. Możesz bezpośrednio używać klientów zestawu Azure SDK. Kod służy do demonstrowania sposobu uzyskiwania tokenu, jeśli jest to konieczne.
using Azure.Core; using Azure.Identity; string userAssignedClientId = "<your managed identity client Id>"; var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = userAssignedClientId }); var accessToken = credential.GetToken(new TokenRequestContext(new[] { "https://vault.azure.net" })); // To print the token, you can convert it to string String accessTokenString = accessToken.Token.ToString(); //You can use the credential object directly with Key Vault client. var client = new SecretClient(new Uri("https://myvault.vault.azure.net/"), credential);
Uzyskiwanie tokenu przy użyciu biblioteki Microsoft.Azure.Services.AppAuthentication dla platformy .NET
W przypadku aplikacji i funkcji platformy .NET najprostszym sposobem pracy z tożsamościami zarządzanymi dla zasobów platformy Azure jest użycie pakietu Microsoft.Azure.Services.AppAuthentication. Ta biblioteka umożliwia również lokalne testowanie kodu na maszynie deweloperów. Kod można przetestować przy użyciu konta użytkownika z poziomu programu Visual Studio, interfejsu wiersza polecenia platformy Azure lub zintegrowanego uwierzytelniania usługi Active Directory. Aby uzyskać więcej informacji na temat lokalnych opcji programowania w tej bibliotece, zobacz dokumentację microsoft.Azure.Services.AppAuthentication. W tej sekcji pokazano, jak rozpocząć pracę z biblioteką w kodzie.
Dodaj odwołania do pakietów NuGet Microsoft.Azure.Services.AppAuthentication i Microsoft.Azure.KeyVault NuGet do aplikacji.
Dodaj następujący kod do aplikacji:
using Microsoft.Azure.Services.AppAuthentication; using Microsoft.Azure.KeyVault; // ... var azureServiceTokenProvider = new AzureServiceTokenProvider(); string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/"); // OR var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
Aby dowiedzieć się więcej o microsoft.Azure.Services.AppAuthentication i udostępnianych operacjach, zobacz przykład Microsoft.Azure.Services.AppAuthentication oraz usług App Service i KeyVault z tożsamościami zarządzanymi dla zasobów platformy Azure .NET.
Uzyskiwanie tokenu przy użyciu języka C#
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
// Build request to acquire managed identities for Azure resources token
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/");
request.Headers["Metadata"] = "true";
request.Method = "GET";
try
{
// Call /token endpoint
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
// Pipe response Stream to a StreamReader, and extract access token
StreamReader streamResponse = new StreamReader(response.GetResponseStream());
string stringResponse = streamResponse.ReadToEnd();
JavaScriptSerializer j = new JavaScriptSerializer();
Dictionary<string, string> list = (Dictionary<string, string>) j.Deserialize(stringResponse, typeof(Dictionary<string, string>));
string accessToken = list["access_token"];
}
catch (Exception e)
{
string errorText = String.Format("{0} \n\n{1}", e.Message, e.InnerException != null ? e.InnerException.Message : "Acquire token failed");
}
Uzyskiwanie tokenu przy użyciu języka Java
Użyj tej biblioteki JSON, aby pobrać token przy użyciu języka Java.
import java.io.*;
import java.net.*;
import com.fasterxml.jackson.core.*;
class GetMSIToken {
public static void main(String[] args) throws Exception {
URL msiEndpoint = new URL("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/");
HttpURLConnection con = (HttpURLConnection) msiEndpoint.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("Metadata", "true");
if (con.getResponseCode()!=200) {
throw new Exception("Error calling managed identity token endpoint.");
}
InputStream responseStream = con.getInputStream();
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(responseStream);
while(!parser.isClosed()){
JsonToken jsonToken = parser.nextToken();
if(JsonToken.FIELD_NAME.equals(jsonToken)){
String fieldName = parser.getCurrentName();
jsonToken = parser.nextToken();
if("access_token".equals(fieldName)){
String accesstoken = parser.getValueAsString();
System.out.println("Access Token: " + accesstoken.substring(0,5)+ "..." + accesstoken.substring(accesstoken.length()-5));
return;
}
}
}
}
}
Uzyskiwanie tokenu przy użyciu języka Go
package main
import (
"fmt"
"io/ioutil"
"net/http"
"net/url"
"encoding/json"
)
type responseJson struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
ExpiresIn string `json:"expires_in"`
ExpiresOn string `json:"expires_on"`
NotBefore string `json:"not_before"`
Resource string `json:"resource"`
TokenType string `json:"token_type"`
}
func main() {
// Create HTTP request for a managed services for Azure resources token to access Azure Resource Manager
var msi_endpoint *url.URL
msi_endpoint, err := url.Parse("http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01")
if err != nil {
fmt.Println("Error creating URL: ", err)
return
}
msi_parameters := msi_endpoint.Query()
msi_parameters.Add("resource", "https://management.azure.com/")
msi_endpoint.RawQuery = msi_parameters.Encode()
req, err := http.NewRequest("GET", msi_endpoint.String(), nil)
if err != nil {
fmt.Println("Error creating HTTP request: ", err)
return
}
req.Header.Add("Metadata", "true")
// Call managed services for Azure resources token endpoint
client := &http.Client{}
resp, err := client.Do(req)
if err != nil{
fmt.Println("Error calling token endpoint: ", err)
return
}
// Pull out response body
responseBytes,err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
fmt.Println("Error reading response body : ", err)
return
}
// Unmarshall response body into struct
var r responseJson
err = json.Unmarshal(responseBytes, &r)
if err != nil {
fmt.Println("Error unmarshalling the response:", err)
return
}
// Print HTTP response and marshalled response body elements to console
fmt.Println("Response status:", resp.Status)
fmt.Println("access_token: ", r.AccessToken)
fmt.Println("refresh_token: ", r.RefreshToken)
fmt.Println("expires_in: ", r.ExpiresIn)
fmt.Println("expires_on: ", r.ExpiresOn)
fmt.Println("not_before: ", r.NotBefore)
fmt.Println("resource: ", r.Resource)
fmt.Println("token_type: ", r.TokenType)
}
Uzyskiwanie tokenu przy użyciu programu PowerShell
W poniższym przykładzie pokazano, jak używać tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z klienta programu PowerShell do:
- Uzyskiwanie tokenu dostępu.
- Użyj tokenu dostępu, aby wywołać interfejs API REST usługi Azure Resource Manager i uzyskać informacje o maszynie wirtualnej. Pamiętaj, aby zastąpić identyfikator subskrypcji, nazwę grupy zasobów i nazwę maszyny wirtualnej odpowiednio dla
<SUBSCRIPTION-ID>
,<RESOURCE-GROUP>
i<VM-NAME>
.
Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -Headers @{Metadata="true"}
Przykład analizowania tokenu dostępu z odpowiedzi:
# Get an access token for managed identities for Azure resources
$response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' `
-Headers @{Metadata="true"}
$content =$response.Content | ConvertFrom-Json
$access_token = $content.access_token
echo "The managed identities for Azure resources access token is $access_token"
# Use the access token to get resource information for the VM
$vmInfoRest = (Invoke-WebRequest -Uri 'https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Compute/virtualMachines/<VM-NAME>?api-version=2017-12-01' -Method GET -ContentType "application/json" -Headers @{ Authorization ="Bearer $access_token"}).content
echo "JSON returned from call to get VM info:"
echo $vmInfoRest
Uzyskiwanie tokenu przy użyciu narzędzia CURL
curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true -s
Przykład analizowania tokenu dostępu z odpowiedzi:
response=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true -s)
access_token=$(echo $response | python -c 'import sys, json; print (json.load(sys.stdin)["access_token"])')
echo The managed identities for Azure resources access token is $access_token
Buforowanie tokenów
Podsystem tożsamości zarządzanych buforuje tokeny, ale nadal zalecamy zaimplementowanie buforowania tokenów w kodzie. Należy przygotować się do scenariuszy, w których zasób wskazuje, że token wygasł.
Wywołania on-the-wire do wyniku identyfikatora Entra firmy Microsoft tylko wtedy, gdy:
- Błąd pamięci podręcznej występuje z powodu braku tokenu w tożsamościach zarządzanych dla pamięci podręcznej podsystemu zasobów platformy Azure.
- Token buforowany wygasł.
Obsługa błędów
Punkt końcowy tożsamości zarządzanych sygnalizuje błędy za pośrednictwem pola kodu stanu nagłówka komunikatu odpowiedzi HTTP jako błędy 4xx lub 5xx:
Kod stanu | Przyczyna błędu | Jak obsługiwać |
---|---|---|
404 Nie znaleziono. | Punkt końcowy USŁUGI IMDS jest aktualizowany. | Ponów próbę przy użyciu wycofywania wykładniczego. Zobacz wskazówki poniżej. |
410 | Usługa IMDS przechodzi przez aktualizacje | Usługi IMDS będą dostępne w ciągu 70 sekund |
429 Zbyt wiele żądań. | Osiągnięto limit ograniczania usługi IMDS. | Ponów próbę przy użyciu wycofywania wykładniczego. Zobacz wskazówki poniżej. |
Błąd 4xx w żądaniu. | Co najmniej jeden parametr żądania był niepoprawny. | Nie próbuj ponownie. Sprawdź szczegóły błędu, aby uzyskać więcej informacji. Błędy 4xx to błędy czasu projektowania. |
Błąd przejściowy 5xx z usługi. | Tożsamości zarządzane dla podsystemu zasobów platformy Azure lub identyfikator entra firmy Microsoft zwrócił błąd przejściowy. | Po odczekaniu co najmniej 1 sekundy można bezpiecznie ponowić próbę. Jeśli ponowisz próbę zbyt szybko lub zbyt często, identyfikator IMDS i/lub identyfikator entra firmy Microsoft może zwrócić błąd limitu szybkości (429). |
timeout | Punkt końcowy USŁUGI IMDS jest aktualizowany. | Ponów próbę przy użyciu wycofywania wykładniczego. Zobacz wskazówki poniżej. |
Jeśli wystąpi błąd, odpowiednia treść odpowiedzi HTTP zawiera kod JSON ze szczegółami błędu:
Element | opis |
---|---|
error | Identyfikator błędu. |
error_description | Pełny opis błędu. Opisy błędów mogą ulec zmianie w dowolnym momencie. Nie należy pisać kodu, który jest odgałęzieny na podstawie wartości w opisie błędu. |
Dokumentacja odpowiedzi HTTP
Ta sekcja zawiera dokumenty dotyczące możliwych odpowiedzi na błędy. Stan "200 OK" to pomyślna odpowiedź, a token dostępu znajduje się w treści odpowiedzi JSON w elemecie access_token.
Kod stanu | Błąd | Opis błędu | Rozwiązanie |
---|---|---|---|
400 Nieprawidłowe żądanie | invalid_resource | AADSTS50001: aplikacja o nazwie <URI> nie została znaleziona w dzierżawie o nazwie <TENANT-ID.> Ten komunikat pokazuje, czy administrator dzierżawy nie zainstalował aplikacji, czy nie wyraził na nie zgody użytkownika dzierżawy. Żądanie uwierzytelnienia mogło zostać wysłane do nieprawidłowej dzierżawy.\ | (Tylko system Linux) |
400 Nieprawidłowe żądanie | bad_request_102 | Nie określono wymaganego nagłówka metadanych | W żądaniu brakuje pola nagłówka Metadata żądania lub jest niepoprawnie sformatowane. Wartość musi być określona jako true , we wszystkich małych literach. Zobacz przykład "Przykładowe żądanie" w poprzedniej sekcji REST. |
401 Brak autoryzacji | unknown_source | Nieznany identyfikator URI źródła <> | Sprawdź, czy identyfikator URI żądania HTTP GET jest poprawnie sformatowany. Część musi być określona scheme:host/resource-path jako http://localhost:50342/oauth2/token . Zobacz przykład "Przykładowe żądanie" w poprzedniej sekcji REST. |
invalid_request | W żądaniu brakuje wymaganego parametru, który zawiera nieprawidłową wartość parametru, zawiera parametr więcej niż raz lub jest nieprawidłowo sformułowany. | ||
unauthorized_client | Klient nie ma autoryzacji do żądania tokenu dostępu przy użyciu tej metody. | Przyczyną żądania na maszynie wirtualnej, która nie ma poprawnie skonfigurowanych tożsamości zarządzanych dla zasobów platformy Azure. Jeśli potrzebujesz pomocy dotyczącej konfiguracji maszyny wirtualnej, zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu witryny Azure Portal . | |
Access_denied | Właściciel zasobu lub serwer autoryzacji odrzucił żądanie. | ||
unsupported_response_type | Serwer autoryzacji nie obsługuje uzyskiwania tokenu dostępu przy użyciu tej metody. | ||
invalid_scope | Żądany zakres jest nieprawidłowy, nieznany lub źle sformułowany. | ||
500 Wewnętrzny błąd serwera | Nieznana | Nie można pobrać tokenu z usługi Active Directory. Aby uzyskać szczegółowe informacje, zobacz dzienniki w <ścieżce pliku> | Sprawdź, czy maszyna wirtualna ma włączone tożsamości zarządzane dla zasobów platformy Azure. Jeśli potrzebujesz pomocy dotyczącej konfiguracji maszyny wirtualnej, zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu witryny Azure Portal . Sprawdź również, czy identyfikator URI żądania HTTP GET jest poprawnie sformatowany, szczególnie identyfikator URI zasobu określony w ciągu zapytania. Zobacz "Przykładowe żądanie" w poprzedniej sekcji REST, na przykład lub usługi platformy Azure, które obsługują uwierzytelnianie Firmy Microsoft Entra, aby uzyskać listę usług i ich odpowiednich identyfikatorów zasobów. |
Ważne
- Usługa IMDS nie jest przeznaczona do użycia za serwerem proxy i nie jest obsługiwana. Przykłady obejścia serwerów proxy można znaleźć w artykule Przykłady metadanych wystąpienia platformy Azure.
Wskazówki dotyczące ponawiania prób
Zaleca się ponowienie próby w przypadku otrzymania kodu błędu 404, 429 lub 5xx (zobacz Obsługa błędów powyżej). Jeśli wystąpi błąd 410, oznacza to, że usługa IMDS przechodzi przez aktualizacje i będzie dostępna w ciągu maksymalnie 70 sekund.
Limity ograniczania mają zastosowanie do liczby wywołań wykonanych w punkcie końcowym usługi IMDS. Po przekroczeniu progu ograniczania punkt końcowy USŁUGI IMDS ogranicza wszelkie dalsze żądania, gdy ograniczenie jest w mocy. W tym okresie punkt końcowy USŁUGI IMDS zwraca kod stanu HTTP 429 ("Zbyt wiele żądań"), a żądania kończą się niepowodzeniem.
Aby ponowić próbę, zalecamy wykonanie następującej strategii:
Strategia ponawiania prób | Ustawienia | Wartości | Jak to działa |
---|---|---|---|
ExponentialBackoff | Liczba ponownych prób Minimalna liczba wycofań Maksymalna liczba wycofań Różnica w liczbie wycofań Pierwsze szybkie ponowienie |
5 0 sek. 60 sek. 2 sek. fałsz |
Próba 1 — opóźnienie 0 sek. Próba 2 — opóźnienie ok. 2 sek. Próba 3 — opóźnienie ok. 6 sek. Próba 4 — opóźnienie ok. 14 sek. Próba 5 — opóźnienie ok. 30 sek. |
Identyfikatory zasobów dla usług platformy Azure
Zobacz Usługi platformy Azure z tożsamościami zarządzanymi obsługują listę zasobów, które obsługują tożsamości zarządzane dla zasobów platformy Azure.
Następne kroki
- Aby włączyć tożsamości zarządzane dla zasobów platformy Azure na maszynie wirtualnej platformy Azure, zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu witryny Azure Portal.