Bir erişim belirteci almak için bir Azure sanal makinesinde Azure kaynakları için yönetilen kimliklerini kullanmaHow to use managed identities for Azure resources on an Azure VM to acquire an access token

Azure kaynakları için yönetilen kimlikler bir Azure Active Directory özelliğidir.Managed identities for Azure resources is a feature of Azure Active Directory. Azure kaynakları için yönetilen kimlikleri destekleyen Azure hizmetlerinin her biri kendi zaman çizelgesine tabidir.Each of the Azure services that support managed identities for Azure resources are subject to their own timeline. Başlamadan önce kaynağınıza yönelik yönetilen kimliklerin kullanılabilirlik durumunu ve bilinen sorunları gözden geçirdiğinizden emin olun.Make sure you review the availability status of managed identities for your resource and known issues before you begin.

Azure kaynakları için yönetilen kimlikleri Azure Active Directory'de otomatik olarak yönetilen bir kimlikle Azure hizmetleri sağlar.Managed identities for Azure resources provides Azure services with an automatically managed identity in Azure Active Directory. Bu kimlik, Azure AD kimlik doğrulaması, kimlik bilgilerini kodunuzda zorunda kalmadan destekleyen herhangi bir hizmeti kimlik doğrulaması için kullanabilirsiniz.You can use this identity to authenticate to any service that supports Azure AD authentication, without having credentials in your code.

Bu makalede, işleme belirteci süre sonu ve HTTP hataları gibi önemli konularda rehberlik yanı sıra, belirteç edinme için çeşitli kod ve betik örnekleri sağlar.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.

ÖnkoşullarPrerequisites

Bu makalede Azure PowerShell örnekleri kullanmayı planlıyorsanız, en son sürümünü yüklediğinizden emin olun Azure PowerShell.If you plan to use the Azure PowerShell examples in this article, be sure to install the latest version of Azure PowerShell.

Önemli

  • Tüm bu makaledeki örnek kodun/betik varsayar istemci, Azure kaynakları için yönetilen kimliklerle bir sanal makinede çalışıyor.All sample code/script in this article assumes the client is running on a virtual machine with managed identities for Azure resources. Sanal makine "Bağlan" özelliği Azure Portalı'nda uzaktan VM'nize bağlanmak için kullanın.Use the virtual machine "Connect" feature in the Azure portal, to remotely connect to your VM. Bir VM'de Azure kaynakları için yönetilen kimlikleri etkinleştirme hakkında daha fazla bilgi için bkz yapılandırma kimlikleri Azure portalını kullanarak bir VM üzerindeki Azure kaynakları için yönetilen, ya da (PowerShell, CLI, bir şablon veya bir Azure kullanarak değişken makalelerden birine SDK'SI).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).

Önemli

  • Azure kaynakları için yönetilen kimliklerinin güvenlik sınırı olduğundan kaynak üzerinde kullanılıyor.The security boundary of managed identities for Azure resources, is the resource it's being used on. Bir sanal makine üzerinde çalışan tüm kod/betikler, istek ve üzerinde kullanılabilir yönetilen tüm kimlikler için belirteçlerini almak.All code/scripts running on a virtual machine can request and retrieve tokens for any managed identities available on it.

Genel BakışOverview

Bir istemci uygulama, Azure kaynakları için yönetilen kimlikleri isteyebilir salt uygulama erişim belirteci belirli bir kaynağa erişmek için.A client application can request managed identities for Azure resources app-only access token for accessing a given resource. Belirteç Azure kaynaklarını hizmet sorumlusu için yönetilen kimliği temel.The token is based on the managed identities for Azure resources service principal. Bu nedenle, kendi hizmet sorumlusu altında bir erişim belirteci almak için istemcinin kendisini kaydetmek gerek yoktur.As such, there is no need for the client to register itself to obtain an access token under its own service principal. Taşıyıcı belirteç olarak kullanmaya uygun bir belirteçtir -hizmet çağrıları gerektiren bir istemci kimlik bilgileri.The token is suitable for use as a bearer token in service-to-service calls requiring client credentials.

HTTP kullanarak bir belirteç AlGet a token using HTTP Azure kaynakları için yönetilen kimlikler için protokol ayrıntılarını belirteç uç noktasıProtocol details for managed identities for Azure resources token endpoint
.NET için Microsoft.Azure.Services.AppAuthentication kitaplığını kullanarak bir belirteç AlGet a token using the Microsoft.Azure.Services.AppAuthentication library for .NET Bir .NET istemcisinden Microsoft.Azure.Services.AppAuthentication kitaplığını kullanma örneğiExample of using the Microsoft.Azure.Services.AppAuthentication library from a .NET client
C# kullanarak bir belirteç AlGet a token using C# Azure kaynaklarını REST uç noktasının bir C# istemciden yönetilen kimliklerle örneğiExample of using managed identities for Azure resources REST endpoint from a C# client
Java kullanarak bir belirteç AlGet a token using Java Azure kaynaklarını REST uç noktasının bir Java istemciden yönetilen kimliklerle örneğiExample of using managed identities for Azure resources REST endpoint from a Java client
Go kullanarak bir belirteç AlGet a token using Go Azure kaynaklarını REST uç noktasını bir Git istemcisi için yönetilen kimliklerle örneğiExample of using managed identities for Azure resources REST endpoint from a Go client
Azure PowerShell kullanarak bir belirteç AlGet a token using Azure PowerShell Azure kaynaklarını REST uç noktasını PowerShell istemcisi için yönetilen kimliklerle örneğiExample of using managed identities for Azure resources REST endpoint from a PowerShell client
CURL kullanarak bir belirteç AlGet a token using CURL Azure kaynaklarını REST uç noktasının bir Bash/CURL istemciden yönetilen kimliklerle örneğiExample of using managed identities for Azure resources REST endpoint from a Bash/CURL client
Belirteç önbelleğe işlemeHandling token caching Süresi dolan erişim belirteçleri işlemek için yönergelerGuidance for handling expired access tokens
Hata işlemeError handling Belirteç uç noktası Azure kaynakları için yönetilen kimlikleri döndürülen HTTP hata işleme yönergeleriGuidance for handling HTTP errors returned from the managed identities for Azure resources token endpoint
Azure Hizmetleri için kaynak kimlikleriResource IDs for Azure services Desteklenen Azure Hizmetleri için nereden kaynak kimlikleriWhere to get resource IDs for supported Azure services

HTTP kullanarak bir belirteç AlGet a token using HTTP

Bir erişim belirteci almak için temel arabirimi, HTTP REST çağrılarını yapabilir VM'de çalıştırılan tüm istemci uygulamaları için erişilebilir hale getirme REST'i temel alır.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. İstemci sanal makineye bir uç nokta kullanır ancak bu Azure AD programlama modeline benzer (vs bir Azure AD uç noktası).This is similar to the Azure AD programming model, except the client uses an endpoint on the virtual machine (vs an Azure AD endpoint).

Azure örnek meta veri hizmeti (IMDS) uç noktayı kullanarak örnek istek (önerilen) :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
ÖğeElement AçıklamaDescription
GET Uç noktasından veri almak istediğiniz gösteren HTTP fiili.The HTTP verb, indicating you want to retrieve data from the endpoint. Bu durumda, bir OAuth erişim belirteci.In this case, an OAuth access token.
http://169.254.169.254/metadata/identity/oauth2/token Azure kaynaklarını uç noktası için örnek meta veri hizmeti için yönetilen kimlikleri.The managed identities for Azure resources endpoint for the Instance Metadata Service.
api-version IMDS uç noktası için API sürümü belirten bir sorgu dizesi parametresi.A query string parameter, indicating the API version for the IMDS endpoint. Lütfen API sürümünü kullanın 2018-02-01 veya büyük.Please use API version 2018-02-01 or greater.
resource Hedef kaynağın uygulama kimliği URİ'sini belirten bir sorgu dizesi parametresi.A query string parameter, indicating the App ID URI of the target resource. Ayrıca şurada görünür aud verilen belirtecin (dinleyici) talep.It also appears in the aud (audience) claim of the issued token. Bu örnekte Azure Resource Manager'a erişmek için bir belirteç isteyen bir uygulama kimliği URI'si, sahip olduğu 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 Azure kaynakları için yönetilen kimlik olarak sunucu tarafı istek sahteciliği (SSRF) saldırılara karşı bir risk azaltma gerekli bir HTTP isteği üstbilgisi alanının.An HTTP request header field, required by managed identities for Azure resources as a mitigation against Server Side Request Forgery (SSRF) attack. Bu değer true", tamamen küçük için" olarak ayarlanmalıdır.This value must be set to "true", in all lower case.
object_id (İsteğe bağlı) Belirteç için istediğiniz yönetilen kimlik object_id belirten bir sorgu dizesi parametresi.(Optional) A query string parameter, indicating the object_id of the managed identity you would like the token for. Sanal makinenize birden çok kullanıcı tarafından atanan yönetilen kimlik varsa, gerekmez.Required, if your VM has multiple user-assigned managed identities.
client_id (İsteğe bağlı) Belirteç için istediğiniz yönetilen kimlik client_id belirten bir sorgu dizesi parametresi.(Optional) A query string parameter, indicating the client_id of the managed identity you would like the token for. Sanal makinenize birden çok kullanıcı tarafından atanan yönetilen kimlik varsa, gerekmez.Required, if your VM has multiple user-assigned managed identities.
mi_res_id (İsteğe bağlı) Belirteç için istediğiniz yönetilen kimlik mi_res_id (Azure kaynak kimliği) belirten bir sorgu dizesi parametresi.(Optional) A query string parameter, indicating the mi_res_id (Azure Resource ID) of the managed identity you would like the token for. Sanal makinenize birden çok kullanıcı tarafından atanan yönetilen kimlik varsa, gerekmez.Required, if your VM has multiple user-assigned managed identities.

VM uzantısı uç noktası Azure kaynakları için yönetilen kimliklerle örnek istek (Ocak 2019'da kullanımdan kaldırma planlanan) :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
ÖğeElement AçıklamaDescription
GET Uç noktasından veri almak istediğiniz gösteren HTTP fiili.The HTTP verb, indicating you want to retrieve data from the endpoint. Bu durumda, bir OAuth erişim belirteci.In this case, an OAuth access token.
http://localhost:50342/oauth2/token Burada 50342 varsayılan bağlantı noktası ve yapılandırılabilir Azure kaynaklarını uç noktası için yönetilen kimlikleri.The managed identities for Azure resources endpoint, where 50342 is the default port and is configurable.
resource Hedef kaynağın uygulama kimliği URİ'sini belirten bir sorgu dizesi parametresi.A query string parameter, indicating the App ID URI of the target resource. Ayrıca şurada görünür aud verilen belirtecin (dinleyici) talep.It also appears in the aud (audience) claim of the issued token. Bu örnekte Azure Resource Manager'a erişmek için bir belirteç isteyen bir uygulama kimliği URI'si, sahip olduğu 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 Azure kaynakları için yönetilen kimlik olarak sunucu tarafı istek sahteciliği (SSRF) saldırılara karşı bir risk azaltma gerekli bir HTTP isteği üstbilgisi alanının.An HTTP request header field, required by managed identities for Azure resources as a mitigation against Server Side Request Forgery (SSRF) attack. Bu değer true", tamamen küçük için" olarak ayarlanmalıdır.This value must be set to "true", in all lower case.
object_id (İsteğe bağlı) Belirteç için istediğiniz yönetilen kimlik object_id belirten bir sorgu dizesi parametresi.(Optional) A query string parameter, indicating the object_id of the managed identity you would like the token for. Sanal makinenize birden çok kullanıcı tarafından atanan yönetilen kimlik varsa, gerekmez.Required, if your VM has multiple user-assigned managed identities.
client_id (İsteğe bağlı) Belirteç için istediğiniz yönetilen kimlik client_id belirten bir sorgu dizesi parametresi.(Optional) A query string parameter, indicating the client_id of the managed identity you would like the token for. Sanal makinenize birden çok kullanıcı tarafından atanan yönetilen kimlik varsa, gerekmez.Required, if your VM has multiple user-assigned managed identities.

Örnek yanıt: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"
}
ÖğeElement AçıklamaDescription
access_token İstenen erişim belirteci.The requested access token. Güvenli bir REST API'nin çağrılması durumunda, belirteç katıştırılmış Authorization isteği üstbilgisi alanının arayan kimliğini doğrulamak API izin vererek "bearer" Token olarak.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 Tarafından yönetilen kimlikleri, Azure kaynakları için kullanılmaz.Not used by managed identities for Azure resources.
expires_in Erişim belirteci, verme zamandan süresi dolmadan önce geçerli olması için devam saniye sayısı.The number of seconds the access token continues to be valid, before expiring, from time of issuance. Verme süresini belirtecin içinde bulunabilir iat talep.Time of issuance can be found in the token's iat claim.
expires_on Erişim belirtecinin süresi dolduğunda TimeSpan değeri.The timespan when the access token expires. Saniyeyi tarih gösterilir "1970-01-01T0:0:0Z UTC" (belirtecinin karşılık gelen exp talep).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 Erişim belirteci etkinleşir ve kabul edilebilir süre.The timespan when the access token takes effect, and can be accepted. Saniyeyi tarih gösterilir "1970-01-01T0:0:0Z UTC" (belirtecinin karşılık gelen nbf talep).The date is represented as the number of seconds from "1970-01-01T0:0:0Z UTC" (corresponds to the token's nbf claim).
resource Erişim belirtecine hangi eşleşmelerini istendi kaynak resource sorgu dizesi parametresi istek.The resource the access token was requested for, which matches the resource query string parameter of the request.
token_type Kaynak bu belirtecin taşıyıcı için erişim verebilirsiniz anlamına gelir "Bearer" erişim belirteci olan Belirtecin türü.The type of token, which is a "Bearer" access token, which means the resource can give access to the bearer of this token.

.NET için Microsoft.Azure.Services.AppAuthentication kitaplığını kullanarak bir belirteç AlGet a token using the Microsoft.Azure.Services.AppAuthentication library for .NET

.NET uygulamaları ve işlevleri için en kolay yolu Azure kaynakları için yönetilen kimliklerle çalışma Microsoft.Azure.Services.AppAuthentication paketidir.For .NET applications and functions, the simplest way to work with managed identities for Azure resources is through the Microsoft.Azure.Services.AppAuthentication package. Bu kitaplık, Visual Studio, kullanıcı hesabını kullanarak yerel olarak geliştirme makinenizde, kodunuzu test etmek de sağlayacak Azure CLI, ya da Active Directory tümleşik kimlik doğrulaması.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. Bu kitaplığı ile yerel geliştirme seçenekleri hakkında daha fazla bilgi için bkz. Microsoft.Azure.Services.AppAuthentication başvuru.For more on local development options with this library, see the Microsoft.Azure.Services.AppAuthentication reference. Bu bölümde, kitaplığı kodunuza kullanmaya başlama işlemini göstermektedir.This section shows you how to get started with the library in your code.

  1. Başvuruları Ekle Microsoft.Azure.Services.AppAuthentication ve Microsoft.Azure.KeyVault uygulamanıza NuGet paketleri.Add references to the Microsoft.Azure.Services.AppAuthentication and Microsoft.Azure.KeyVault NuGet packages to your application.

  2. Uygulamanız için aşağıdaki kodu ekleyin: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));
    

Microsoft.Azure.Services.AppAuthentication ve kullanıma sunduğu işlemleri hakkında daha fazla bilgi için bkz: Microsoft.Azure.Services.AppAuthentication başvuru ve App Service ve KeyVault ile yönetilen Azure kaynakları .NET örneği için kimlikleri.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.

C# kullanarak bir belirteç AlGet 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");
}

Java kullanarak bir belirteç AlGet a token using Java

Bunu kullanın JSON Kitaplığı Java kullanarak bir belirteç almak için.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;
                }
            }
        }
    }
}

Go kullanarak bir belirteç AlGet 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)
}

Azure PowerShell kullanarak bir belirteç AlGet a token using Azure PowerShell

Aşağıdaki örnek, Azure kaynaklarını REST uç noktası için bir PowerShell istemciden yönetilen kimlikleri kullanılmak üzere gösterilmektedir:The following example demonstrates how to use the managed identities for Azure resources REST endpoint from a PowerShell client to:

  1. Erişim belirteci alma.Acquire an access token.
  2. Bir Azure Resource Manager REST API çağrısı ve VM hakkında bilgi almak için erişim belirteci kullanın.Use the access token to call an Azure Resource Manager REST API and get information about the VM. Yerine, abonelik kimliği, kaynak grubu adı ve sanal makine adı için mutlaka <SUBSCRIPTION-ID>, <RESOURCE-GROUP>, ve <VM-NAME>sırasıyla.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"}

Erişim belirteci yanıt ayrıştırmayı örneğinde: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

CURL kullanarak bir belirteç AlGet 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

Erişim belirteci yanıt ayrıştırmayı örneğinde: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

Belirteç önbelleğe almaToken caching

While yönetilen kimlikleri için kullanılan Azure kaynaklarını alt sistem (VM uzantısını Azure kaynakları için kimlikleri IMDS ve yönetilen) belirteçleri, ayrıca öneririz kodunuzda belirteç önbelleğe uygulamak için önbelleğe almaz.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. Sonuç olarak, burada kaynak belirtecinin kullanım süresi doldu gösterir senaryoları için hazırlamanız gerekir.As a result, you should prepare for scenarios where the resource indicates that the token is expired.

Azure AD-hat üzerinde çağrısına neden yalnızca zaman:On-the-wire calls to Azure AD result only when:

  • önbellek isabetsizliği alt sistemi önbelleği Azure kaynakları için yönetilen kimlikleri herhangi bir belirteci dolayı gerçekleşircache miss occurs due to no token in the managed identities for Azure resources subsystem cache
  • önbelleğe alınan belirteç süresi dolduthe cached token is expired

Hata işlemeError handling

Azure kaynaklarını uç noktası için yönetilen kimlikleri 4xx veya 5xx hata olarak HTTP yanıt iletisi üst bilgi, durum kodu alanına aracılığıyla hataları bildirir: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:

Durum koduStatus Code Hata nedeniError Reason Nasıl yapılacağınıHow To Handle
404 bulunamadı.404 Not found. IMDS uç noktası güncelleniyor.IMDS endpoint is updating. Expontential geri alma ile yeniden deneyin.Retry with Expontential Backoff. Rehbere bakın.See guidance below.
429 çok fazla istek.429 Too many requests. IMDS azaltma sınırına ulaşıldı.IMDS Throttle limit reached. Üstel geri alma ile yeniden deneyin.Retry with Exponential Backoff. Rehbere bakın.See guidance below.
isteğinde 4xx hata oluştu.4xx Error in request. Bir veya daha fazla istek parametreleri büyük/küçük harf yanlış.One or more of the request parameters was incorrect. Yeniden denemeyin.Do not retry. Daha fazla bilgi için hata ayrıntılarını inceleyin.Examine the error details for more information. 4xx, tasarım zamanı hataları hatalardır.4xx errors are design-time errors.
5XX hizmetinden geçici hata.5xx Transient error from service. Azure kaynaklarını alt sistemi veya Azure Active Directory için yönetilen kimlikleri, geçici bir hata döndürdü.The managed identities for Azure resources sub-system or Azure Active Directory returned a transient error. En az 1 saniye bekledikten sonra yeniden denemek güvenlidir.It is safe to retry after waiting for at least 1 second. Çok hızlı bir şekilde veya çok sık tekrar denerseniz, IMDS ve/veya Azure AD oranı sınırı hatası (429) döndürebilir.If you retry too quickly or too often, IMDS and/or Azure AD may return a rate limit error (429).
timeouttimeout IMDS uç noktası güncelleniyor.IMDS endpoint is updating. Expontential geri alma ile yeniden deneyin.Retry with Expontential Backoff. Rehbere bakın.See guidance below.

Bir hata oluşursa, karşılık gelen HTTP yanıt gövdesi JSON ile hata ayrıntılarını içerir:If an error occurs, the corresponding HTTP response body contains JSON with the error details:

ÖğeElement AçıklamaDescription
errorerror Hata tanımlayıcı.Error identifier.
error_descriptionerror_description Hatanın ayrıntılı bir açıklaması.Verbose description of error. Hata açıklamaları dilediğiniz zaman değiştirebilirsiniz. Dalları hata açıklamasını değerlere göre kod yazma.Error descriptions can change at any time. Do not write code that branches based on values in the error description.

HTTP yanıt başvurusuHTTP response reference

Bu bölümde, olası hata yanıtları belgeler.This section documents the possible error responses. Bir "200 Tamam" durumu başarılı bir yanıt ve access_token öğesi yanıt gövdesinde JSON, erişim belirtecini bulunur.A "200 OK" status is a successful response, and the access token is contained in the response body JSON, in the access_token element.

Durum koduStatus code HataError Hata açıklamasıError Description ÇözümSolution
400 Hatalı istek400 Bad Request invalid_resourceinvalid_resource AADSTS50001: Adlı uygulama <URI> adlı kiracıda bulunamadı <KİRACI-kimliği> .AADSTS50001: The application named <URI> was not found in the tenant named <TENANT-ID>. Uygulama değil Kiracı Yöneticisi tarafından yüklenmemiş veya kiracıdaki herhangi bir kullanıcı tarafından onay varsa bu durum oluşabilir.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. Kimlik doğrulaması isteğinizi yanlış kiracıya göndermiş olabilirsiniz. You might have sent your authentication request to the wrong tenant.\ (Yalnızca Linux)(Linux only)
400 Hatalı istek400 Bad Request bad_request_102bad_request_102 Gerekli meta veriler üst bilgisi belirtilmediRequired metadata header not specified Her iki Metadata isteği üstbilgisi alanının isteğinizden eksik veya hatalı biçimlendirilmiş.Either the Metadata request header field is missing from your request, or is formatted incorrectly. Değer olarak belirtilmelidir true, tüm alt durumda.The value must be specified as true, in all lower case. "Örnek istek" bir örnek için önceki REST bölümüne bakın.See the "Sample request" in the preceding REST section for an example.
401 Yetkisiz401 Unauthorized unknown_sourceunknown_source Bilinmeyen kaynak <URI'si>Unknown Source <URI> HTTP GET isteği URI doğru şekilde biçimlendirildiğini doğrulayın.Verify that your HTTP GET request URI is formatted correctly. scheme:host/resource-path Bölümü olarak belirtilmelidir http://localhost:50342/oauth2/token.The scheme:host/resource-path portion must be specified as http://localhost:50342/oauth2/token. "Örnek istek" bir örnek için önceki REST bölümüne bakın.See the "Sample request" in the preceding REST section for an example.
invalid_requestinvalid_request İstek gerekli parametre eksik, geçersiz bir parametre değeri içerir, birden çok kez bir parametre içerir veya aksi halde yanlış biçimlendirilmiş.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 Bu yöntemi kullanarak bir erişim belirteci istemek için istemci yetkili değil.The client is not authorized to request an access token using this method. Uzantı çağırmak için yerel bir geri döngü kullanmadı bir istek veya doğru şekilde yapılandırılmış Azure kaynakları için yönetilen kimliklerine sahip olmayan bir VM'de neden oldu.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. Bkz: yapılandırma kimlikleri Azure portalını kullanarak bir VM üzerindeki Azure kaynakları için yönetilen VM yapılandırması ile ilgili yardıma ihtiyacınız varsa.See Configure managed identities for Azure resources on a VM using the Azure portal if you need assistance with VM configuration.
access_deniedaccess_denied Kaynak sahibi veya yetkilendirme sunucusu isteği reddetti.The resource owner or authorization server denied the request.
unsupported_response_typeunsupported_response_type Yetkilendirme sunucusu, bu yöntemi kullanarak bir erişim belirteci alma desteklemez.The authorization server does not support obtaining an access token using this method.
invalid_scopeinvalid_scope İstenen kapsamı geçersiz, bilinmeyen ya da hatalı biçimlendirilmiş.The requested scope is invalid, unknown, or malformed.
500 İç sunucu hatası500 Internal server error Bilinmiyorunknown Active Directory'den belirteci alınamadı.Failed to retrieve token from the Active directory. Günlüklerde ayrıntıları görmek için <dosya yolu>For details see logs in <file path> Azure kaynakları için yönetilen kimlikleri etkinleştirildi, VM'de doğrulayın.Verify that managed identities for Azure resources has been enabled on the VM. Bkz: yapılandırma kimlikleri Azure portalını kullanarak bir VM üzerindeki Azure kaynakları için yönetilen VM yapılandırması ile ilgili yardıma ihtiyacınız varsa.See Configure managed identities for Azure resources on a VM using the Azure portal if you need assistance with VM configuration.

Ayrıca, HTTP GET isteği URI özellikle URI sorgu dizesinde belirtilen kaynak doğru şekilde biçimlendirildiğini doğrulayın.Also verify that your HTTP GET request URI is formatted correctly, particularly the resource URI specified in the query string. Örnek, önceki REST bölümünde "örnek istek" konusuna bakın veya Azure Hizmetleri söz konusu destek Azure AD kimlik doğrulamasını hizmetler ve bunların ilgili kaynak kimlikleri listesi için.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.

Yeniden deneme KılavuzuRetry guidance

404 hatası, 429 ve 5xx hata kodu alırsanız yeniden denemek için önerilen (bkz hata işleme yukarıda).It is recommended to retry if you receive a 404, 429, or 5xx error code (see Error handling above).

IMDS uç noktaya yapılan çağrıların sayısını azaltma sınırları uygulanır.Throttling limits apply to the number of calls made to the IMDS endpoint. Azaltma eşiği aşıldığında IMDS uç nokta azaltma etkinken ek istekleri kısıtlar.When the throttling threshold is exceeded, IMDS endpoint limits any further requests while the throttle is in effect. Bu süre boyunca IMDS uç noktası HTTP durum kodu 429 döndürür ("çok fazla istek"), ve istekleri başarısız olur.During this period, the IMDS endpoint will return the HTTP status code 429 ("Too many requests"), and the requests fail.

Yeniden deneme için aşağıdaki stratejisi öneririz:For retry, we recommend the following strategy:

Yeniden deneme stratejisiRetry strategy AyarlarSettings DeğerlerValues Nasıl çalışır?How it works
ExponentialBackoffExponentialBackoff Yeniden deneme sayısıRetry count
En düşük geri almaMin back-off
En yüksek geri almaMax back-off
Delta geri almaDelta back-off
İlk hızlı yeniden denemeFirst fast retry
55
0 sn0 sec
60 sn60 sec
2 sn2 sec
falsefalse
Deneme 1 - 0 sn gecikmeAttempt 1 - delay 0 sec
Deneme 2 - yaklaşık 2 sn gecikmeAttempt 2 - delay ~2 sec
Deneme 3 - yaklaşık 6 sn gecikmeAttempt 3 - delay ~6 sec
Deneme 4 - yaklaşık 14 sn gecikmeAttempt 4 - delay ~14 sec
Deneme 5 - yaklaşık 30 sn gecikmeAttempt 5 - delay ~30 sec

Azure Hizmetleri için kaynak kimlikleriResource IDs for Azure services

Bkz: Azure Hizmetleri, desteği Azure AD kimlik doğrulaması Azure AD'ye destekleyen ve Azure kaynaklarını ve onların ilgili kaynak kimlikleri için yönetilen kimliklerle test kaynaklar listesi.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.

Sonraki adımlarNext steps