Jak używać tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej platformy Azure w celu uzyskania tokenu dostępuHow to use managed identities for Azure resources on an Azure VM to acquire an access token

Zarządzane tożsamości dla zasobów platformy Azure to funkcja usługi Azure Active Directory.Managed identities for Azure resources is a feature of Azure Active Directory. Każda usługa platformy Azure obsługująca tożsamości zarządzane dla zasobów platformy Azure ma własną oś czasu.Each of the Azure services that support managed identities for Azure resources are subject to their own timeline. Pamiętaj, aby przed rozpoczęciem sprawdzić stan dostępności tożsamości zarządzanych dla swojego zasobu i znane problemy.Make sure you review the availability status of managed identities for your resource and known issues before you begin.

Zarządzane tożsamości dla zasobów platformy Azure zapewniają usługi platformy Azure z automatycznie zarządzaną tożsamością w Azure Active Directory.Managed identities for Azure resources provides Azure services with an automatically managed identity in Azure Active Directory. Tej tożsamości można użyć do uwierzytelniania w dowolnej usłudze, która obsługuje uwierzytelnianie usługi Azure AD, bez poświadczeń w kodzie.You can use this identity to authenticate to any service that supports Azure AD authentication, without having credentials in your code.

Ten artykuł zawiera różne przykłady kodu i skryptów do pozyskiwania tokenów, a także wskazówki dotyczące ważnych tematów, takich jak obsługa wygaśnięcia tokenu i błędów HTTP.This article provides various code and script examples for token acquisition, as well as guidance on important topics such as handling token expiration and HTTP errors.

Wymagania wstępnePrerequisites

  • Jeśli nie znasz funkcji tożsamości zarządzanych dla zasobów platformy Azure, zobacz to omówienie.If you're not familiar with the managed identities for Azure resources feature, see this overview. Jeśli nie masz jeszcze konta platformy Azure, przed kontynuowaniem utwórz bezpłatne konto.If you don't have an Azure account, sign up for a free account before you continue.

Jeśli planujesz użyć przykładów Azure PowerShell w tym artykule, pamiętaj, aby zainstalować najnowszą wersję Azure PowerShell.If you plan to use the Azure PowerShell examples in this article, be sure to install the latest version of Azure PowerShell.

Ważne

  • We wszystkich przykładowym kodzie/skrypcie w tym artykule przyjęto założenie, że klient działa na maszynie wirtualnej z tożsamościami zarządzanymi dla zasobów platformy Azure.All sample code/script in this article assumes the client is running on a virtual machine with managed identities for Azure resources. Użyj funkcji "Połącz" maszyny wirtualnej w Azure Portal, aby zdalnie nawiązać połączenie z maszyną wirtualną.Use the virtual machine "Connect" feature in the Azure portal, to remotely connect to your VM. Aby uzyskać szczegółowe informacje na temat włączania tożsamości zarządzanych dla zasobów platformy Azure na maszynie wirtualnej, zobacz Konfigurowanie zarządzanych tożsamości dla zasobów platformy Azure na maszynie wirtualnej przy użyciu Azure Portallub jednego z artykułów wariantów (przy użyciu programu PowerShell, interfejsu wiersza polecenia, szablonu lub zestawu Azure SDK).For details on enabling managed identities for Azure resources on a VM, see Configure managed identities for Azure resources on a VM using the Azure portal, or one of the variant articles (using PowerShell, CLI, a template, or an Azure SDK).

Ważne

  • Granica zabezpieczeń zarządzanych tożsamości dla zasobów platformy Azure jest zasobem używanym przez program.The security boundary of managed identities for Azure resources, is the resource it's being used on. Wszystkie kod/skrypty uruchomione na maszynie wirtualnej mogą żądać i pobierać tokeny dla wszystkich zarządzanych tożsamości.All code/scripts running on a virtual machine can request and retrieve tokens for any managed identities available on it.

PrzeglądOverview

Aplikacja kliencka może zażądać tożsamości zarządzanych dla tokenu dostępu tylko do aplikacji platformy Azure w celu uzyskania dostępu do danego zasobu.A client application can request managed identities for Azure resources app-only access token for accessing a given resource. Token jest oparty na tożsamościach zarządzanych dla jednostki usługi Azure Resources.The token is based on the managed identities for Azure resources service principal. W związku z tym klient nie musi rejestrować się w celu uzyskania tokenu dostępu w ramach własnej nazwy głównej usługi.As such, there is no need for the client to register itself to obtain an access token under its own service principal. Token jest odpowiedni do użycia jako token okaziciela w wywołaniach między usługami wymagającymi poświadczeń klienta.The token is suitable for use as a bearer token in service-to-service calls requiring client credentials.

Uzyskiwanie tokenu przy użyciu protokołu HTTPGet a token using HTTP Szczegóły protokołu dla tożsamości zarządzanych dla punktu końcowego tokenu zasobów platformy AzureProtocol details for managed identities for Azure resources token endpoint
Uzyskiwanie tokenu przy użyciu biblioteki Microsoft. Azure. Services. AppAuthentication dla platformy .NETGet a token using the Microsoft.Azure.Services.AppAuthentication library for .NET Przykład korzystania z biblioteki Microsoft. Azure. Services. AppAuthentication z klienta platformy .NETExample of using the Microsoft.Azure.Services.AppAuthentication library from a .NET client
Uzyskiwanie tokenu przy użyciuC#Get a token using C# Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z C# klientaExample of using managed identities for Azure resources REST endpoint from a C# client
Uzyskiwanie tokenu przy użyciu języka JavaGet a token using Java Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z klienta JavaExample of using managed identities for Azure resources REST endpoint from a Java client
Uzyskiwanie tokenu przy użyciu języka goGet a token using Go Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta programu goExample of using managed identities for Azure resources REST endpoint from a Go client
Uzyskiwanie tokenu przy użyciu Azure PowerShellGet a token using Azure PowerShell Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z poziomu klienta programu PowerShellExample of using managed identities for Azure resources REST endpoint from a PowerShell client
Uzyskiwanie tokenu przy użyciu ZWINIĘCIEaGet a token using CURL Przykład użycia tożsamości zarządzanych dla punktu końcowego REST zasobów platformy Azure z klienta bash/ZWINIĘCIEExample of using managed identities for Azure resources REST endpoint from a Bash/CURL client
Obsługa buforowania tokenuHandling token caching Wskazówki dotyczące obsługi wygasłych tokenów dostępuGuidance for handling expired access tokens
Obsługa błędówError handling Wskazówki dotyczące obsługi błędów HTTP zwróconych z zarządzanych tożsamości dla punktu końcowego tokenu zasobów platformy AzureGuidance for handling HTTP errors returned from the managed identities for Azure resources token endpoint
Identyfikatory zasobów dla usług platformy AzureResource IDs for Azure services Gdzie można uzyskać identyfikatory zasobów dla obsługiwanych usług platformy AzureWhere to get resource IDs for supported Azure services

Uzyskiwanie tokenu przy użyciu protokołu HTTPGet a token using HTTP

Podstawowy interfejs do uzyskiwania tokenu dostępu jest oparty na 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.The fundamental interface for acquiring an access token is based on REST, making it accessible to any client application running on the VM that can make HTTP REST calls. Jest to podobne do modelu programowania usługi Azure AD, z tą różnicą, że klient używa punktu końcowego na maszynie wirtualnej (vs punktu końcowego usługi Azure AD).This is similar to the Azure AD programming model, except the client uses an endpoint on the virtual machine (vs an Azure AD endpoint).

Przykładowe żądanie przy użyciu punktu końcowego Instance Metadata Service platformy Azure ( zalecane) :Sample request using the Azure Instance Metadata Service (IMDS) endpoint (recommended):

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
ElementElement OpisDescription
GET Czasownik HTTP wskazujący, że chcesz pobrać dane z punktu końcowego.The HTTP verb, indicating you want to retrieve data from the endpoint. W tym przypadku token dostępu OAuth.In this case, an OAuth access token.
http://169.254.169.254/metadata/identity/oauth2/token Zarządzane tożsamości dla punktu końcowego zasobów platformy Azure dla Instance Metadata Service.The managed identities for Azure resources endpoint for the Instance Metadata Service.
api-version Parametr ciągu zapytania, wskazujący wersję interfejsu API dla punktu końcowego IMDS.A query string parameter, indicating the API version for the IMDS endpoint. Użyj interfejsu API w wersji 2018-02-01 lub nowszej.Please use API version 2018-02-01 or greater.
resource Parametr ciągu zapytania, wskazujący identyfikator URI aplikacji dla zasobu docelowego.A query string parameter, indicating the App ID URI of the target resource. Pojawia się również w aud (grupy odbiorców) wystawionego tokenu.It also appears in the aud (audience) claim of the issued token. Ten przykład żąda tokenu w celu uzyskania dostępu do Azure Resource Manager, który ma identyfikator URI aplikacji https://management.azure.com/.This example requests a token to access Azure Resource Manager, which has an App ID URI of https://management.azure.com/.
Metadata Pole nagłówka żądania HTTP wymagane przez zarządzane tożsamości dla zasobów platformy Azure jako środki zaradcze związane z atakiem z fałszerstwem żądania po stronie serwera (SSRF).An HTTP request header field, required by managed identities for Azure resources as a mitigation against Server Side Request Forgery (SSRF) attack. Ta wartość musi być ustawiona na wartość "true" w przypadku małych liter.This value must be set to "true", in all lower case.
object_id Obowiązkowe Parametr ciągu zapytania, wskazujący object_id tożsamości zarządzanej, dla której ma być token.(Optional) A query string parameter, indicating the object_id of the managed identity you would like the token for. Wymagane, jeśli maszyna wirtualna ma wiele zarządzanych tożsamości przypisanych przez użytkownika.Required, if your VM has multiple user-assigned managed identities.
client_id Obowiązkowe Parametr ciągu zapytania, wskazujący client_id tożsamości zarządzanej, dla której ma być token.(Optional) A query string parameter, indicating the client_id of the managed identity you would like the token for. Wymagane, jeśli maszyna wirtualna ma wiele zarządzanych tożsamości przypisanych przez użytkownika.Required, if your VM has multiple user-assigned managed identities.
mi_res_id Obowiązkowe Parametr ciągu zapytania, wskazujący mi_res_id (identyfikator zasobu platformy Azure) tożsamości zarządzanej, dla której ma być token.(Optional) A query string parameter, indicating the mi_res_id (Azure Resource ID) of the managed identity you would like the token for. Wymagane, jeśli maszyna wirtualna ma wiele zarządzanych tożsamości przypisanych przez użytkownika.Required, if your VM has multiple user-assigned managed identities.

Przykładowe żądanie przy użyciu tożsamości zarządzanych dla punktu końcowego rozszerzenia maszyny wirtualnej Azure Resources (zaplanowane do wycofania w styczniu 2019) :Sample request using the managed identities for Azure resources VM Extension Endpoint (planned for deprecation in January 2019):

GET http://localhost:50342/oauth2/token?resource=https%3A%2F%2Fmanagement.azure.com%2F HTTP/1.1
Metadata: true
ElementElement OpisDescription
GET Czasownik HTTP wskazujący, że chcesz pobrać dane z punktu końcowego.The HTTP verb, indicating you want to retrieve data from the endpoint. W tym przypadku token dostępu OAuth.In this case, an OAuth access token.
http://localhost:50342/oauth2/token Zarządzane tożsamości dla punktu końcowego zasobów platformy Azure, gdzie 50342 jest portem domyślnym i można skonfigurować.The managed identities for Azure resources endpoint, where 50342 is the default port and is configurable.
resource Parametr ciągu zapytania, wskazujący identyfikator URI aplikacji dla zasobu docelowego.A query string parameter, indicating the App ID URI of the target resource. Pojawia się również w aud (grupy odbiorców) wystawionego tokenu.It also appears in the aud (audience) claim of the issued token. Ten przykład żąda tokenu w celu uzyskania dostępu do Azure Resource Manager, który ma identyfikator URI aplikacji https://management.azure.com/.This example requests a token to access Azure Resource Manager, which has an App ID URI of https://management.azure.com/.
Metadata Pole nagłówka żądania HTTP wymagane przez zarządzane tożsamości dla zasobów platformy Azure jako środki zaradcze związane z atakiem z fałszerstwem żądania po stronie serwera (SSRF).An HTTP request header field, required by managed identities for Azure resources as a mitigation against Server Side Request Forgery (SSRF) attack. Ta wartość musi być ustawiona na wartość "true" w przypadku małych liter.This value must be set to "true", in all lower case.
object_id Obowiązkowe Parametr ciągu zapytania, wskazujący object_id tożsamości zarządzanej, dla której ma być token.(Optional) A query string parameter, indicating the object_id of the managed identity you would like the token for. Wymagane, jeśli maszyna wirtualna ma wiele zarządzanych tożsamości przypisanych przez użytkownika.Required, if your VM has multiple user-assigned managed identities.
client_id Obowiązkowe Parametr ciągu zapytania, wskazujący client_id tożsamości zarządzanej, dla której ma być token.(Optional) A query string parameter, indicating the client_id of the managed identity you would like the token for. Wymagane, jeśli maszyna wirtualna ma wiele zarządzanych tożsamości przypisanych przez użytkownika.Required, if your VM has multiple user-assigned managed identities.

Przykładowa odpowiedź:Sample response:

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"
}
ElementElement OpisDescription
access_token Żądany token dostępu.The requested access token. Podczas wywoływania bezpiecznego interfejsu API REST token jest osadzony w polu nagłówka żądania Authorization jako token "Bearer", co umożliwia interfejsowi API uwierzytelnianie obiektu wywołującego.When calling a secured REST API, the token is embedded in the Authorization request header field as a "bearer" token, allowing the API to authenticate the caller.
refresh_token Nieużywane przez zarządzane tożsamości dla zasobów platformy Azure.Not used by managed identities for Azure resources.
expires_in Liczba sekund, przez jaką token dostępu pozostaje prawidłowy, przed wygaśnięciem, od momentu wystawienia.The number of seconds the access token continues to be valid, before expiring, from time of issuance. Czas wystawienia można znaleźć w poiatie tokenu.Time of issuance can be found in the token's iat claim.
expires_on Wartość TimeSpan w przypadku wygaśnięcia tokenu dostępu.The timespan when the access token expires. Data jest reprezentowana jako liczba sekund od "1970-01-01T0:0: 0Z UTC" (odpowiada expm tokenowi tokenu).The date is represented as the number of seconds from "1970-01-01T0:0:0Z UTC" (corresponds to the token's exp claim).
not_before Przedział czasu, gdy token dostępu zaczyna obowiązywać i można go zaakceptować.The timespan when the access token takes effect, and can be accepted. Data jest reprezentowana jako liczba sekund od "1970-01-01T0:0: 0Z UTC" (odpowiada nbfm tokenowi tokenu).The date is represented as the number of seconds from "1970-01-01T0:0:0Z UTC" (corresponds to the token's nbf claim).
resource Zasób, dla którego zażądano tokenu dostępu, który jest zgodny z parametrem resource ciągu zapytania żądania.The resource the access token was requested for, which matches the resource query string parameter of the request.
token_type Typ tokenu, który jest tokenem dostępu "Bearer", co oznacza, że zasób może zapewnić dostęp do okaziciela tego tokenu.The type of token, which is a "Bearer" access token, which means the resource can give access to the bearer of this token.

Uzyskiwanie tokenu przy użyciu biblioteki Microsoft. Azure. Services. AppAuthentication dla platformy .NETGet a token using the Microsoft.Azure.Services.AppAuthentication library for .NET

W przypadku aplikacji i funkcji platformy .NET Najprostszym sposobem pracy z tożsamościami zarządzanymi dla zasobów platformy Azure jest pakiet Microsoft. Azure. Services. AppAuthentication.For .NET applications and functions, the simplest way to work with managed identities for Azure resources is through the Microsoft.Azure.Services.AppAuthentication package. Ta biblioteka umożliwia również testowanie kodu lokalnie na komputerze deweloperskim przy użyciu konta użytkownika z programu Visual Studio, interfejsu wiersza polecenia platformy Azurelub zintegrowanego uwierzytelniania Active Directory.This library will also allow you to test your code locally on your development machine, using your user account from Visual Studio, the Azure CLI, or Active Directory Integrated Authentication. Aby uzyskać więcej informacji na temat lokalnych opcji tworzenia w tej bibliotece, zobacz odwołanie Microsoft. Azure. Services. AppAuthentication.For more on local development options with this library, see the Microsoft.Azure.Services.AppAuthentication reference. W tej sekcji pokazano, jak rozpocząć pracę z biblioteką w kodzie.This section shows you how to get started with the library in your code.

  1. Dodaj odwołania do pakietów NuGet Microsoft. Azure. Services. AppAuthentication i Microsoft. Azure.Add references to the Microsoft.Azure.Services.AppAuthentication and Microsoft.Azure.KeyVault NuGet packages to your application.

  2. Dodaj następujący kod do aplikacji:Add the following code to your application:

    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 wykonywanych przez niego operacji, zobacz artykuł Microsoft. Azure. Services. AppAuthentication , a App Service i Magazyn kluczy z tożsamościami zarządzanymi dla przykładu .NET zasobów platformy Azure.To learn more about Microsoft.Azure.Services.AppAuthentication and the operations it exposes, see the Microsoft.Azure.Services.AppAuthentication reference and the App Service and KeyVault with managed identities for Azure resources .NET sample.

Uzyskiwanie tokenu przy użyciuC#Get a token using 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 JavaGet a token using Java

Użyj tej biblioteki JSON do pobrania tokenu przy użyciu języka Java.Use this JSON library to retrieve a token using 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 goGet a token using 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 := url.Values{}
    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 Azure PowerShellGet a token using Azure PowerShell

W poniższym przykładzie pokazano, jak używać zarządzanych tożsamości dla punktu końcowego REST zasobów platformy Azure z poziomu klienta programu PowerShell, aby:The following example demonstrates how to use the managed identities for Azure resources REST endpoint from a PowerShell client to:

  1. Uzyskaj token dostępu.Acquire an access token.
  2. Użyj tokenu dostępu, aby wywołać interfejs API REST Azure Resource Manager i uzyskać informacje o maszynie wirtualnej.Use the access token to call an Azure Resource Manager REST API and get information about the VM. Pamiętaj, aby zastąpić identyfikator subskrypcji, nazwę grupy zasobów i nazwę maszyny wirtualnej odpowiednio do <SUBSCRIPTION-ID>, <RESOURCE-GROUP>i <VM-NAME>.Be sure to substitute your subscription ID, resource group name, and virtual machine name for <SUBSCRIPTION-ID>, <RESOURCE-GROUP>, and <VM-NAME>, respectively.
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 na temat analizowania tokenu dostępu z odpowiedzi:Example on how to parse the access token from the response:

# 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 ZWINIĘCIEaGet a token using 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 na temat analizowania tokenu dostępu z odpowiedzi:Example on how to parse the access token from the response:

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ówToken caching

Podczas gdy zarządzane tożsamości dla podsystemu zasobów platformy Azure są używane (tożsamości IMDS/Managed dla rozszerzenia maszyny wirtualnej zasobów platformy Azure) są tokenami pamięci podręcznej, zalecamy także zaimplementowanie buforowania tokenu w kodzie.While the managed identities for Azure resources subsystem being used (IMDS/managed identities for Azure resources VM Extension) does cache tokens, we also recommend to implement token caching in your code. W związku z tym należy przygotować się do scenariuszy, w których zasób wskazuje, że token wygasł.As a result, you should prepare for scenarios where the resource indicates that the token is expired.

Wywołania usługi Azure AD w sieci szkieletowej tylko wtedy, gdy:On-the-wire calls to Azure AD result only when:

  • Chybienia w pamięci podręcznej występuje z powodu braku tokenu w zarządzanych tożsamościach pamięci podręcznej podsystemu zasobów platformy Azurecache miss occurs due to no token in the managed identities for Azure resources subsystem cache
  • token pamięci podręcznej wygasłthe cached token is expired

Obsługa błędówError handling

Zarządzane tożsamości punktu końcowego zasobów platformy Azure sygnalizują błędy za pośrednictwem pola kod stanu w nagłówku komunikatu odpowiedzi HTTP, ponieważ 4xx lub 5xx błędy:The managed identities for Azure resources endpoint signals errors via the status code field of the HTTP response message header, as either 4xx or 5xx errors:

Kod stanuStatus Code Przyczyna błęduError Reason Jak obsłużyćHow To Handle
nie znaleziono 404.404 Not found. Trwa aktualizowanie punktu końcowego IMDS.IMDS endpoint is updating. Ponów próbę, używając expontential wycofywania.Retry with Expontential Backoff. Zobacz wskazówki poniżej.See guidance below.
429 zbyt wiele żądań.429 Too many requests. Osiągnięto limit dławienia IMDS.IMDS Throttle limit reached. Ponów próbę, używając wykładniczej wycofywania.Retry with Exponential Backoff. Zobacz wskazówki poniżej.See guidance below.
4xx Błąd w żądaniu.4xx Error in request. Co najmniej jeden z parametrów żądania był niepoprawny.One or more of the request parameters was incorrect. Nie ponawiaj próby.Do not retry. Aby uzyskać więcej informacji, zapoznaj się ze szczegółami błędu.Examine the error details for more information. Błędy 4xx są błędy czasu projektowania.4xx errors are design-time errors.
5xx błąd przejściowy z usługi.5xx Transient error from service. Zarządzane tożsamości dla podsystemu zasobów platformy Azure lub Azure Active Directory zwróciło błąd przejściowy.The managed identities for Azure resources sub-system or Azure Active Directory returned a transient error. Można bezpiecznie ponowić próbę po odczekaniu przez co najmniej 1 sekundę.It is safe to retry after waiting for at least 1 second. Jeśli spróbujesz zbyt szybko lub zbyt często, IMDS i/lub usługa Azure AD może zwrócić błąd limitu szybkości (429).If you retry too quickly or too often, IMDS and/or Azure AD may return a rate limit error (429).
timeouttimeout Trwa aktualizowanie punktu końcowego IMDS.IMDS endpoint is updating. Ponów próbę, używając expontential wycofywania.Retry with Expontential Backoff. Zobacz wskazówki poniżej.See guidance below.

Jeśli wystąpi błąd, odpowiadająca treść odpowiedzi HTTP zawiera kod JSON z szczegółowymi informacjami o błędzie:If an error occurs, the corresponding HTTP response body contains JSON with the error details:

ElementElement OpisDescription
errorerror Identyfikator błędu.Error identifier.
error_descriptionerror_description Pełny opis błędu.Verbose description of error. Opis błędów można zmienić w dowolnym momencie. Nie należy pisać kodu, który oddziałuje na podstawie wartości w opisie błędu.Error descriptions can change at any time. Do not write code that branches based on values in the error description.

Odwołanie do odpowiedzi HTTPHTTP response reference

Ta sekcja dokumentuje możliwe odpowiedzi na błędy.This section documents the possible error responses. Stan "200 OK" jest pomyślną odpowiedzią, a token dostępu jest zawarty w kodzie JSON treści odpowiedzi, w elemencie access_token.A "200 OK" status is a successful response, and the access token is contained in the response body JSON, in the access_token element.

Kod stanuStatus code BłądError Opis błęduError Description RozwiązanieSolution
400 Nieprawidłowe żądanie400 Bad Request invalid_resourceinvalid_resource AADSTS50001: aplikacja o nazwie >URI< nie została znaleziona w dzierżawie o nazwie <identyfikator dzierżawcy> .AADSTS50001: The application named <URI> was not found in the tenant named <TENANT-ID>. Taka sytuacja może wystąpić, jeśli aplikacja nie została zainstalowana przez administratora dzierżawy lub nie została wysłana przez żadnego użytkownika w dzierżawie.This can happen if the application has not been installed by the administrator of the tenant or consented to by any user in the tenant. Być może wysłano żądanie uwierzytelnienia do niewłaściwej dzierżawy. You might have sent your authentication request to the wrong tenant.\ (Tylko system Linux)(Linux only)
400 Nieprawidłowe żądanie400 Bad Request bad_request_102bad_request_102 Nie określono wymaganego nagłówka metadanychRequired metadata header not specified W żądaniu brakuje pola nagłówka żądania Metadata lub jest ono sformatowane nieprawidłowo.Either the Metadata request header field is missing from your request, or is formatted incorrectly. Wartość musi być określona jako true, we wszystkich małych przypadkach.The value must be specified as true, in all lower case. Zapoznaj się z przykładem "Przykładowe żądanie" w poprzedniej sekcji REST.See the "Sample request" in the preceding REST section for an example.
401 — nieautoryzowane401 Unauthorized unknown_sourceunknown_source Nieznany Identyfikator URI<źródła>Unknown Source <URI> Sprawdź, czy identyfikator URI żądania HTTP GET jest poprawnie sformatowany.Verify that your HTTP GET request URI is formatted correctly. Część scheme:host/resource-path musi być określona jako http://localhost:50342/oauth2/token.The scheme:host/resource-path portion must be specified as http://localhost:50342/oauth2/token. Zapoznaj się z przykładem "Przykładowe żądanie" w poprzedniej sekcji REST.See the "Sample request" in the preceding REST section for an example.
invalid_requestinvalid_request W żądaniu brakuje wymaganego parametru, zawiera on nieprawidłową wartość parametru, zawiera parametr więcej niż jeden raz lub jest nieprawidłowo sformułowany.The request is missing a required parameter, includes an invalid parameter value, includes a parameter more than once, or is otherwise malformed.
unauthorized_clientunauthorized_client Klient nie ma autoryzacji do żądania tokenu dostępu za pomocą tej metody.The client is not authorized to request an access token using this method. Spowodowane przez żądanie, które nie używało lokalnego sprzężenia zwrotnego do wywołania rozszerzenia lub na maszynie wirtualnej, która nie ma prawidłowo skonfigurowanych tożsamości zarządzanych dla zasobów platformy Azure.Caused by a request that didn’t use local loopback to call the extension, or on a VM that doesn’t have managed identities for Azure resources configured correctly. Aby uzyskać pomoc dotyczącą konfiguracji maszyny wirtualnej , zobacz Konfigurowanie zarządzanych tożsamości dla zasobów platformy Azure na maszynie wirtualnej przy użyciu Azure Portal .See Configure managed identities for Azure resources on a VM using the Azure portal if you need assistance with VM configuration.
access_deniedaccess_denied Właściciel zasobu lub serwer autoryzacji odrzucił żądanie.The resource owner or authorization server denied the request.
unsupported_response_typeunsupported_response_type Serwer autoryzacji nie obsługuje uzyskiwania tokenu dostępu przy użyciu tej metody.The authorization server does not support obtaining an access token using this method.
invalid_scopeinvalid_scope Żądany zakres jest nieprawidłowy, nieznany lub źle sformułowany.The requested scope is invalid, unknown, or malformed.
Błąd wewnętrzny serwera 500500 Internal server error znanaunknown Nie można pobrać tokenu z usługi Active Directory.Failed to retrieve token from the Active directory. Aby uzyskać szczegółowe informacje, zobacz dzienniki w <ścieżka pliku>For details see logs in <file path> Sprawdź, czy na maszynie wirtualnej została włączona tożsamość zarządzana dla zasobów platformy Azure.Verify that managed identities for Azure resources has been enabled on the VM. Aby uzyskać pomoc dotyczącą konfiguracji maszyny wirtualnej , zobacz Konfigurowanie zarządzanych tożsamości dla zasobów platformy Azure na maszynie wirtualnej przy użyciu Azure Portal .See Configure managed identities for Azure resources on a VM using the Azure portal if you need assistance with VM configuration.

Sprawdź również, czy identyfikator URI żądania HTTP GET jest poprawnie sformatowany, szczególnie identyfikator URI zasobu określony w ciągu zapytania.Also verify that your HTTP GET request URI is formatted correctly, particularly the resource URI specified in the query string. Zapoznaj się z sekcją "Przykładowe żądanie" w poprzedniej sekcji REST, aby zapoznać się z przykładem lub usługami platformy Azure, które obsługują uwierzytelnianie usługi Azure AD w celu uzyskania listy usług i odpowiednich identyfikatorów zasobów.See the "Sample request" in the preceding REST section for an example, or Azure services that support Azure AD authentication for a list of services and their respective resource IDs.

Wskazówki dotyczące ponawiania próbRetry guidance

Zalecane jest ponowienie próby, jeśli otrzymasz kod błędu 404, 429 lub 5xx (zobacz sekcję Obsługa błędów powyżej).It is recommended to retry if you receive a 404, 429, or 5xx error code (see Error handling above).

Limity ograniczania stosują się do liczby wywołań w punkcie końcowym IMDS.Throttling limits apply to the number of calls made to the IMDS endpoint. Gdy zostanie przekroczony próg ograniczania przepustowości, IMDS punkt końcowy ogranicza wszelkie dalsze żądania, gdy ograniczanie jest włączone.When the throttling threshold is exceeded, IMDS endpoint limits any further requests while the throttle is in effect. W tym okresie punkt końcowy IMDS zwróci kod stanu HTTP 429 ("zbyt wiele żądań"), a żądania nie powiodą się.During this period, the IMDS endpoint will return the HTTP status code 429 ("Too many requests"), and the requests fail.

W przypadku ponowienia próby zalecamy następujące strategie:For retry, we recommend the following strategy:

Strategia ponawiania próbRetry strategy UstawieniaSettings WartościValues Jak to działaHow it works
ExponentialBackoffExponentialBackoff Liczba ponownych próbRetry count
Minimalna liczba wycofańMin back-off
Maksymalna liczba wycofańMax back-off
Różnica w liczbie wycofańDelta back-off
Pierwsze szybkie ponowienieFirst fast retry
55
0 sek.0 sec
60 sek.60 sec
2 sek.2 sec
falsefalse
Próba 1 — opóźnienie 0 sek.Attempt 1 - delay 0 sec
Próba 2 — opóźnienie ok. 2 sek.Attempt 2 - delay ~2 sec
Próba 3 — opóźnienie ok. 6 sek.Attempt 3 - delay ~6 sec
Próba 4 — opóźnienie ok. 14 sek.Attempt 4 - delay ~14 sec
Próba 5 — opóźnienie ok. 30 sek.Attempt 5 - delay ~30 sec

Identyfikatory zasobów dla usług platformy AzureResource IDs for Azure services

Zobacz usługi platformy Azure, które obsługują uwierzytelnianie usługi Azure AD , aby uzyskać listę zasobów, które obsługują usługę Azure AD i zostały przetestowane przy użyciu tożsamości zarządzanych dla zasobów platformy Azure oraz ich identyfikatorów zasobów.See Azure services that support Azure AD authentication for a list of resources that support Azure AD and have been tested with managed identities for Azure resources, and their respective resource IDs.

Następne krokiNext steps