Udostępnij za pośrednictwem


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 zapewniają usługom tej platformy 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 usługi Microsoft Entra bez konieczności przechowywania poświadczeń w kodzie.

Ten artykuł zawiera różne przykłady kodu i skryptów służące do uzyskiwania tokenów. Zawiera również wskazówki dotyczące obsługi wygaśnięcia tokenu i błędów HTTP.

Wymagania wstępne

  • Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zapoznaj się z tym omówieniem. Jeśli nie masz jeszcze konta platformy Azure, przed kontynuowaniem utwórz bezpłatne konto.

Jeśli planujesz użyć przykładów Azure PowerShell w tym artykule, pamiętaj o zainstalowaniu najnowszej wersji 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łącz" maszyny wirtualnej w 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 kody/skrypty uruchomione na maszynie wirtualnej mogą żądać i pobierać tokeny dla dowolnych tożsamości zarządzanych dostępnych na niej.

Przegląd

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 okaziciela w wywołaniach typu usługa-usługa wymagających poświadczeń klienta.

Odnośnik Opis
Pobieranie 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 Azure.Identity Pobieranie tokenu przy użyciu biblioteki Azure.Identity
Pobieranie tokenu przy użyciu biblioteki Microsoft.Azure.Services.AppAuthentication dla platformy .NET Przykład użycia biblioteki Microsoft.Azure.Services.AppAuthentication z klienta .NET
Pobieranie 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 klienta języka C#
Pobieranie 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 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
Pobieranie 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 klienta programu PowerShell
Zdobądź token za pomocą CURL Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z klienta powłoki 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 można uzyskać identyfikatory zasobów dla obsługiwanych usług platformy Azure

Pobieranie tokenu przy użyciu protokołu HTTP

Podstawowy interfejs uzyskiwania tokenu dostępu jest oparty na protokole REST, dzięki czemu jest on dostępny dla dowolnej aplikacji klienckiej uruchomionej na maszynie wirtualnej, która może wykonywać wywołania HTTP REST. To podejście jest podobne do modelu programowania Microsoft Entra, z tą różnicą, że klient używa punktu końcowego na maszynie wirtualnej (a nie punktu końcowego Microsoft Entra).

Przykładowe żądanie korzystające z 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
Składnik 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 IMDS. Użyj interfejsu API w wersji 2018-02-01 lub nowszej.
resource Parametr ciągu zapytania wskazujący identyfikator URI aplikacji zasobu docelowego. Pojawia się również w aud oświadczeniu (odbiorców) wyemitowanego tokena. W tym przykładzie żąda tokenu w celu uzyskania dostępu do usługi Azure Resource Manager, który ma identyfikator URI identyfikatora aplikacji .https://management.azure.com/
Metadata Pole nagłówka żądania HTTP wymagane przez tożsamości zarządzane. Te informacje są używane jako środki zaradcze przed atakami typu sfałszowanie żądań po stronie serwera (SSRF). Ta wartość musi być ustawiona na "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 użyć tokenu. 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 użyć tokenu. 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 użyć tokenu. 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"
}
Składnik Opis
access_token Żądany token dostępu. Po wywołaniu zabezpieczonego interfejsu API REST token jest osadzany w polu nagłówka Authorization żądania jako token "okaziciela", co umożliwia interfejsowi API uwierzytelnienie obiektu wywołującego.
refresh_token Nie jest używane 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 wydania tokenu można znaleźć w oświadczeniu 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świadczeniu tokenu exp).
not_before Przedział czasu, w którym token dostępu zaczyna obowiązywać i może zostać zaakceptowany. Data jest reprezentowana jako liczba sekund od "1970-01-01T0:0:0Z UTC" (odpowiada oświadczeniu tokenu nbf).
resource Zasób, dla którego zażądano tokenu dostępu, który jest zgodny z parametrem resource ciągu zapytania żądania.
token_type Typ tokenu, który jest "Bearer" tokenem dostępu, co oznacza, że zasób może udzielić dostępu osobie posiadającej ten token.

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ą Azure.Identity , która zapewnia obsługę elementu DefaultAzureCredential. Ta klasa ułatwia korzystanie z tożsamości zarządzanych z zestawami SDK platformy Azure.Dowiedz się więcej

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

  2. Skorzystaj z poniższego przykładowego kodu. Nie musisz się martwić o zdobycie tokenów. Możesz bezpośrednio użyć klientów zestawu Azure SDK. Kod służy do pokazania, jak uzyskać token, jeśli zajdzie taka potrzeba.

    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);
    

Pobieranie 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 skorzystanie z pakietu Microsoft.Azure.Services.AppAuthentication. Ta biblioteka pozwoli Ci również przetestować kod lokalnie na komputerze deweloperskim. Kod można przetestować przy użyciu konta użytkownika z 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 za pomocą tej biblioteki, 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 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 na temat Microsoft.Azure.Services.AppAuthentication i operacji, które uwidacznia, zobacz dokumentację Microsoft.Azure.Services.AppAuthentication oraz przykład App Service i KeyVault z tożsamościami zarządzanymi dla zasobów platformy Azure na platformie .NET.

Pobieranie 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");
}

Pobieranie 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)
}

Pobieranie 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 w celu:

  1. Uzyskaj token 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 sposobu 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

Zdobądź token za pomocą 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 sposobu 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ę na scenariusze, w których zasób wskazuje, że token wygasł.

Wywołania on-the-wire z identyfikatorem Microsoft Entra są wynikiem tylko wtedy, gdy:

  • Brak 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 w pamięci podręcznej 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 IMDS jest aktualizowany. Ponów próbę przy użyciu wykładniczego opóźniania. Zobacz wskazówki poniżej.
410 IMDS przechodzi aktualizacje IMDS będzie dostępny w ciągu 70 sekund
429 Zbyt wiele żądań. IMDS Osiągnięto limit przepustnicy. Ponów próbę przy użyciu wykładniczego opóźniania. 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.
5xx Błąd przejściowy z usługi. Tożsamości zarządzane dla podsystemu zasobów platformy Azure lub identyfikatora Microsoft Entra zwróciły błąd przejściowy. Można bezpiecznie ponowić próbę po odczekaniu co najmniej 1 sekundy. Jeśli ponowisz próbę zbyt szybko lub zbyt często, IMDS i/lub identyfikator Microsoft Entra mogą zwrócić błąd limitu szybkości (429).
limit czasu Punkt końcowy IMDS jest aktualizowany. Ponów próbę przy użyciu wykładniczego opóźniania. Zapoznaj się ze wskazówkami później.

Jeśli wystąpi błąd, odpowiednia treść odpowiedzi HTTP zawiera kod JSON ze szczegółami błędu:

Składnik Opis
błąd Identyfikator błędu.
opis błędu Szczegółowy opis błędu. Opisy błędów mogą ulec zmianie w dowolnym momencie. Nie należy pisać kodu, który rozgałęzia się na podstawie wartości w opisie błędu.

Dokumentacja odpowiedzi HTTP

W tej sekcji opisano możliwe odpowiedzi na błędy. Stan "200 OK" to pomyślna odpowiedź, a token dostępu jest zawarty w formacie JSON treści odpowiedzi w elemencie access_token.

Kod stanu Błąd Opis błędu Rozwiązanie
400 Nieprawidłowe żądanie zasób_nieważny 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 lub żaden użytkownik dzierżawy nie wyraził na nią zgody. Być może żądanie uwierzytelnienia zostało wysłane do niewłaściwej dzierżawy.\ (Tylko Linux)
400 Nieprawidłowe żądanie zła_prośba_102 Nie określono wymaganego nagłówka metadanych W żądaniu brakuje pola nagłówka Metadata żądania lub jest ono niepoprawnie sformatowane. Wartość musi być określona jako true, wszystkimi małymi literami. Aby zapoznać się z przykładem, zobacz "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. Porcja scheme:host/resource-path musi być określona jako http://localhost:50342/oauth2/token. Aby zapoznać się z przykładem, zobacz "Przykładowe żądanie" w poprzedniej sekcji REST.
nieprawidłowe_żądanie W żądaniu brakuje wymaganego parametru, zawiera nieprawidłową wartość parametru, zawiera parametr więcej niż raz lub jest w inny sposób źle sformułowane.
nieautoryzowany_klient Klient nie jest upoważniony do żądania tokenu dostępu przy użyciu tej metody. Spowodowane żądaniem na maszynie wirtualnej, która nie ma poprawnie skonfigurowanych tożsamości zarządzanych dla zasobów platformy Azure. Zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu Azure Portal , jeśli potrzebujesz pomocy dotyczącej konfiguracji maszyny wirtualnej.
odmowa dostępu Właściciel zasobu lub serwer autoryzacji odrzucił żądanie.
nieobsługiwany_typ_odpowiedzi Serwer autoryzacji nie obsługuje uzyskiwania tokenu dostępu przy użyciu tej metody.
nieprawidłowy_zakres Żądany zakres jest nieprawidłowy, nieznany lub zniekształcony.
500 Wewnętrzny błąd serwera nieznany 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. Zobacz Konfigurowanie tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej przy użyciu Azure Portal , jeśli potrzebujesz pomocy dotyczącej konfiguracji maszyny wirtualnej.

Sprawdź również, czy identyfikator URI żądania HTTP GET jest poprawnie sformatowany, w szczególności identyfikator URI zasobu określony w ciągu zapytania. Zobacz przykład "Przykładowe żądanie" w poprzedniej sekcji REST lub usługi platformy Azure, które obsługują uwierzytelnianie Microsoft Entra , aby uzyskać listę usług i ich odpowiednich identyfikatorów zasobów.

Ważne

Wskazówki dotyczące ponawiania prób

Ponów próbę, jeśli zostanie wyświetlony kod błędu 404, 429 lub 5xx (patrz Obsługa błędów). Jeśli pojawi się błąd 410, oznacza to, że IMDS przechodzi aktualizacje i będzie dostępny w ciągu maksymalnie 70 sekund.

Limity ograniczania przepustowości mają zastosowanie do liczby połączeń wykonanych z punktem końcowym IMDS. Po przekroczeniu progu ograniczania przepustowości punkt końcowy IMDS ogranicza wszelkie dalsze żądania w czasie działania ograniczenia. W tym okresie punkt końcowy IMDS zwraca kod stanu HTTP 429 ("Zbyt wiele żądań"), a żądania kończą się niepowodzeniem.

W przypadku ponawiania próby zalecamy następującą strategię:

Strategia ponawiania prób Ustawienia Wartości Jak to działa
Wykładniczy wycofanie Liczba ponownych prób
Minimalny wycofanie
Maksymalne wycofanie
Różnica w liczbie wycofań
Pierwsza szybka ponowna próba
5
0 sekund
60 sekund
2 sekundy
fałszywy
Próba 1 — opóźnienie 0 sekund
Próba 2 - opóźnienie ~2 sekundy
Próba 3 - opóźnienie ~6 sekund
Próba 4 - opóźnienie ~14 sekund
Próba 5 - opóźnienie ~30 sekund

Identyfikatory zasobów dla usług platformy Azure

Zobacz Usługi platformy Azure z obsługą tożsamości zarządzanych , aby uzyskać listę zasobów, które obsługują tożsamości zarządzane dla zasobów platformy Azure.

Dalsze kroki