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

  1. Zainstaluj pakiet Azure.Identity i inne wymagane pakiety bibliotek zestawu Azure SDK, takie jak Azure.Security.KeyVault.Secrets.

  2. 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.

  1. Dodaj odwołania do pakietów NuGet Microsoft.Azure.Services.AppAuthentication i Microsoft.Azure.KeyVault NuGet do aplikacji.

  2. 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:

  1. Uzyskiwanie tokenu dostępu.
  2. 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