Azure kaynakları için yönetilen kimlikler, Azure hizmetlerine Microsoft Entra ID üzerinde otomatik olarak yönetilen bir kimlik sağlar. Kodunuzda kimlik bilgileri olmadan Microsoft Entra kimlik doğrulamasını destekleyen herhangi bir hizmette kimlik doğrulaması yapmak için bu kimliği kullanabilirsiniz.
Bu makalede belirteç alımı için çeşitli kod ve betik örnekleri sağlanmaktadır. Ayrıca belirteç süre sonu ve HTTP hatalarını işleme hakkında yönergeler içerir.
Ön koşullar
Azure kaynakları için yönetilen kimlikler özelliği hakkında bilgi sahibi değilseniz bu genel bakışı inceleyin. Azure hesabınız yoksa, devam etmeden önce ücretsiz bir hesaba kaydolun.
Bu makaledeki tüm örnek kod/betik, istemcinin Azure kaynakları için yönetilen kimliklere sahip bir sanal makinede çalıştığını varsayar. Sanal makinenize uzaktan bağlanmak için Azure portalındaki "Bağlan" sanal makinesi özelliğini kullanın. Vm'de Azure kaynakları için yönetilen kimlikleri etkinleştirme hakkında ayrıntılı bilgi için bkz . Azure portalını veya değişken makalelerden birini (PowerShell, CLI, şablon veya Azure SDK kullanarak) kullanarak VM'de Azure kaynakları için yönetilen kimlikleri yapılandırma.
Önemli
Azure kaynakları için yönetilen kimliklerin güvenlik sınırı, kimliğin kullanıldığı kaynaktır. Sanal makinede çalışan tüm kodlar/betikler, üzerinde bulunan tüm yönetilen kimlikler için belirteç isteyebilir ve alabilir.
Genel Bakış
İstemci uygulaması, belirli bir kaynağa erişmek için yalnızca yönetilen kimlik uygulaması erişim belirteci isteyebilir. Belirteç, Azure kaynakları hizmet sorumlusu için yönetilen kimlikleri temel alır. Bu nedenle, istemcinin kendi hizmet sorumlusu altında erişim belirteci alması gerekmez. Belirteç, istemci kimlik bilgileri gerektiren hizmet-hizmet çağrılarında taşıyıcı belirteç olarak kullanıma uygundur.
Desteklenen Azure hizmetleri için kaynak kimlikleri nereden alınır?
HTTP kullanarak belirteç alma
Erişim belirteci almak için temel arabirim REST'i temel alır ve bu da BUNU VM üzerinde çalışan ve HTTP REST çağrıları yapabilen tüm istemci uygulamaları için erişilebilir hale getirir. Bu yaklaşım Microsoft Entra programlama modeline benzer, ancak istemci sanal makinede bir uç nokta kullanır (Microsoft Entra uç noktası ile karşıtlık).
Azure Örnek Meta Veri Hizmeti (I AVH) uç noktasını kullanan örnek istek (önerilir):
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
Öğe
Tanım
GET
Uç noktadan veri almak istediğinizi belirten HTTP fiili. Bu durumda, bir OAuth erişim belirteci.
Örnek Meta Veri Hizmeti için Azure kaynakları uç noktası için yönetilen kimlikler.
api-version
I AVH uç noktasının API sürümünü gösteren bir sorgu dizesi parametresi. API sürümünü veya üzerini 2018-02-01 kullanın.
resource
Hedef kaynağın Uygulama Kimliği URI'sini gösteren bir sorgu dizesi parametresi. Ayrıca verilen belirtecin aud (hedef kitle) talebinde de görünür. Bu örnek, Uygulama Kimliği URI'si olan Azure Resource Manager'a erişmek için bir belirteç istemektedir https://management.azure.com/.
Metadata
Yönetilen kimlikler için gereken BIR HTTP isteği üst bilgisi alanı. Bu bilgiler, sunucu tarafı istek sahteciliği (SSRF) saldırılarına karşı bir risk azaltma olarak kullanılır. Bu değer küçük harfle "true" olarak ayarlanmalıdır.
object_id
(İsteğe bağlı) Belirteci istediğiniz yönetilen kimliğin object_id belirten bir sorgu dizesi parametresi. Vm'nizde kullanıcı tarafından atanan birden çok yönetilen kimlik varsa gereklidir.
client_id
(İsteğe bağlı) Belirteci istediğiniz yönetilen kimliğin client_id belirten bir sorgu dizesi parametresi. Vm'nizde kullanıcı tarafından atanan birden çok yönetilen kimlik varsa gereklidir.
msi_res_id
(İsteğe bağlı) Belirteci istediğiniz yönetilen kimliğin msi_res_id (Azure Kaynak Kimliği) belirten bir sorgu dizesi parametresi. Vm'nizde kullanıcı tarafından atanan birden çok yönetilen kimlik varsa gereklidir.
İstenen erişim belirteci. Güvenli bir REST API çağırdığınızda, belirteç istek üst bilgisi alanına "taşıyıcı" belirteç olarak eklenir Authorization ve API'nin çağıranın kimliğini doğrulamasına olanak sağlar.
refresh_token
Azure kaynakları için yönetilen kimlikler tarafından kullanılmaz.
expires_in
Erişim belirtecinin süresi dolmadan önce, verme zamanından itibaren geçerli olmaya devam eden saniye sayısı. Verme zamanı belirtecin iat talepte bulunabilir.
expires_on
Erişim belirtecinin süresi dolduğunda zaman aralığı. Tarih, "1970-01-01T0:0:0Z UTC" (belirtecin exp talebine karşılık gelir) arasındaki saniye sayısı olarak gösterilir.
not_before
Erişim belirtecinin etkin olduğu ve kabul edilebildiği zaman aralığı. Tarih, "1970-01-01T0:0:0Z UTC" (belirtecin nbf talebine karşılık gelir) arasındaki saniye sayısı olarak gösterilir.
"Taşıyıcı" erişim belirteci olan belirteç türü, kaynağın bu belirtecin taşıyıcısına erişim verebileceği anlamına gelir.
Azure kimlik istemci kitaplığını kullanarak belirteç alma
Yönetilen kimlikleri kullanmanın önerilen yolu Azure kimlik istemci kitaplığını kullanmaktır. Tüm Azure SDK'ları DefaultAzureCredential için destek sağlayan kitaplıkla Azure.Identity tümleştirilir. Bu sınıf, Azure SDK'ları ile Yönetilen Kimlikleri kullanmayı kolaylaştırır.Daha fazla bilgi edinin
Aşağıdaki örnek kodu kullanın. Belirteçleri alma konusunda endişelenmenize gerek yoktur. Azure SDK istemcilerini doğrudan kullanabilirsiniz. Kod, gerekirse belirtecin nasıl alınıp alınmadığını göstermek içindir.
C#
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);
.NET için Microsoft.Azure.Services.AppAuthentication kitaplığını kullanarak belirteç alma
.NET uygulamaları ve işlevleri için, Azure kaynakları için yönetilen kimliklerle çalışmanın en basit yolu Microsoft.Azure.Services.AppAuthentication paketinden geçer. Bu kitaplık, kodunuzu geliştirme makinenizde yerel olarak test etmenizi de sağlar. Visual Studio, Azure CLI veya Active Directory Tümleşik Kimlik Doğrulaması'ndan kullanıcı hesabınızı kullanarak kodunuzu test edebilirsiniz. Bu kitaplıkla yerel geliştirme seçenekleri hakkında daha fazla bilgi için bkz . Microsoft.Azure.Services.AppAuthentication başvurusu. Bu bölümde, kodunuzda kitaplığı kullanmaya nasıl başladığınız gösterilir.
Uygulamanıza Microsoft.Azure.Services.AppAuthentication ve Microsoft.Azure.KeyVault NuGet paketlerine başvurular ekleyin.
Aşağıdaki kodu uygulamanıza ekleyin:
C#
using Microsoft.Azure.Services.AppAuthentication;
using Microsoft.Azure.KeyVault;
// ...var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://management.azure.com/");
// ORvar kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
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"`
}
funcmain() {
// Create HTTP request for a managed services for Azure resources token to access Azure Resource Managervar 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 structvar 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)
}
PowerShell kullanarak belirteç alma
Aşağıdaki örnekte, Bir PowerShell istemcisinden Azure kaynakları REST uç noktası için yönetilen kimliklerin nasıl kullanılacağı gösterilmektedir:
Erişim belirteci alma.
Azure Resource Manager REST API'sini çağırmak ve VM hakkında bilgi almak için erişim belirtecini kullanın. Sırasıyla, , ve için abonelik kimliğinizi, kaynak grubu adınızı ve <VM-NAME>sanal makine adınızı <SUBSCRIPTION-ID><RESOURCE-GROUP>değiştirip değiştirmemeye özen gösterin.
# 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
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 alma
Yönetilen kimlikler alt sistemi belirteçleri önbelleğe alır, ancak yine de kodunuzda belirteç önbelleğe alma uygulamanızı öneririz.
Kaynağın belirtecin süresinin dolduğunu gösterdiği senaryolara hazırlanmanız gerekir.
Microsoft Entra Id'ye yapılan kablolu aramalar yalnızca aşağıdaki durumlarda sonuçlanır:
Önbellek kaçırma işlemi, Azure kaynakları alt sistem önbelleği için yönetilen kimliklerde belirteç olmamasından kaynaklanmaktadır.
Önbelleğe alınan belirtecin süresi doldu.
Hata işleme
Yönetilen kimlikler uç noktası, HTTP yanıt iletisi üst bilgisinin durum kodu alanı aracılığıyla hataları 4xx veya 5xx hataları olarak işaretler:
Durum Kodu
Hata Nedeni
nasıl işlenir
404 Bulunamadı.
Uç nokta AVH güncelleştiriliyor.
Üstel Geri Alma ile yeniden deneyin. Aşağıdaki yönergelere bakın.
410
güncelleştirmeleri AVH
AVH 70 saniye içinde hazır olacağım
429 Çok fazla istek var.
AVH kısıtlama sınırına ulaştım.
Üstel Geri Alma ile yeniden deneyin. Aşağıdaki yönergelere bakın.
İstekte 4xx Hatası.
İstek parametrelerinden biri veya daha fazlası yanlıştı.
Yeniden denemeyin. Daha fazla bilgi için hata ayrıntılarını inceleyin. 4xx hataları tasarım zamanı hatalarıdır.
Hizmetten 5xx Geçici hata.
Azure kaynakları alt sistemi veya Microsoft Entra Kimliği için yönetilen kimlikler geçici bir hata döndürdü.
En az 1 saniye bekledikten sonra yeniden denemek güvenlidir. Çok hızlı veya çok sık yeniden denerseniz, I AVH ve/veya Microsoft Entra Id bir hız sınırı hatası (429) döndürebilir.
timeout
Uç nokta AVH güncelleştiriliyor.
Üstel Geri Alma ile yeniden deneyin. Aşağıdaki yönergelere bakın.
Bir hata oluşursa, ilgili HTTP yanıt gövdesinde hata ayrıntılarıyla birlikte JSON bulunur:
Öğe
Tanım
error
Hata tanımlayıcısı.
error_description
Hatanın ayrıntılı açıklaması. Hata açıklamaları istediğiniz zaman değişebilir. Hata açıklamasındaki değerlere göre dallayan kod yazmayın.
HTTP yanıt başvurusu
Bu bölümde olası hata yanıtları belgelemektedir. "200 Tamam" durumu başarılı bir yanıttır ve erişim belirteci access_token öğesindeki yanıt gövdesi JSON'unda yer alır.
Durum kodu
Hata
Hata Açıklaması
Çözüm
400 Hatalı İstek
invalid_resource
AADSTS50001: URI> adlı< uygulama TENANT-ID> adlı <kiracıda bulunamadı. Bu ileti, kiracı yöneticisinin uygulamayı yüklemediğini veya hiçbir kiracı kullanıcısının uygulamayı yüklemediğini gösterir. Kimlik doğrulama isteğinizi yanlış kiracıya göndermiş olabilirsiniz.\
(Yalnızca Linux)
400 Hatalı İstek
bad_request_102
Gerekli meta veri üst bilgisi belirtilmedi
Metadata İstek üst bilgisi alanı isteğinizde yok veya yanlış biçimlendirildi. Değerin küçük harfle truebelirtilmesi gerekir. Bir örnek için önceki REST bölümünde yer alan "Örnek istek" bölümüne bakın.
401 Yetkisiz
unknown_source
Bilinmeyen Kaynak <URI'si>
HTTP GET isteği URI'nizin doğru biçimlendirildiğini doğrulayın. Bölümü scheme:host/resource-path olarak http://localhost:50342/oauth2/tokenbelirtilmelidir. Bir örnek için önceki REST bölümünde yer alan "Örnek istek" bölümüne bakın.
invalid_request
İstekte gerekli bir parametre eksik, geçersiz parametre değeri var, birden çok parametre içeriyor veya başka bir şekilde hatalı biçimlendirilmiş.
unauthorized_client
İstemcinin bu yöntemi kullanarak erişim belirteci isteme yetkisi yok.
Azure kaynakları için doğru yapılandırılmış yönetilen kimliklere sahip olmayan bir VM'de yapılan istek neden oldu. VM yapılandırmasıyla ilgili yardıma ihtiyacınız varsa bkz . Azure portalını kullanarak VM'de Azure kaynakları için yönetilen kimlikleri yapılandırma.
access_denied
Kaynak sahibi veya yetkilendirme sunucusu isteği reddetti.
unsupported_response_type
Yetkilendirme sunucusu bu yöntemi kullanarak erişim belirteci almayı desteklemez.
invalid_scope
İstenen kapsam geçersiz, bilinmiyor veya hatalı biçimlendirilmiş.
500 İç sunucu hatası
bilinmiyor
Active Directory'den belirteç alınamadı. Ayrıntılar için bkz. dosya yolundaki <günlükler>
VM'de Azure kaynakları için yönetilen kimliklerin etkinleştirildiğini doğrulayın. VM yapılandırmasıyla ilgili yardıma ihtiyacınız varsa bkz . Azure portalını kullanarak VM'de Azure kaynakları için yönetilen kimlikleri yapılandırma.
Ben AVH bir ara sunucu arkasında kullanılmak üzere tasarlanmamıştır ve bunu yapmak desteklenmiyor. Proxy'leri atlama örnekleri için Bkz. Azure Örneği Meta Veri Örnekleri.
Yeniden deneme kılavuzu
404, 429 veya 5xx hata kodu alırsanız yeniden denemeniz önerilir (yukarıdaki Hata işleme bölümüne bakın). 410 hatası alırsanız bu, güncelleştirmeleri AVH ve en fazla 70 saniye içinde kullanılabilir olacağını gösterir.
Azaltma sınırları, I AVH uç noktasına yapılan çağrı sayısı için geçerlidir. Azaltma eşiği aşıldığında AVH kısıtlama etkinken uç nokta diğer istekleri sınırlar. Bu süre boyunca I AVH uç noktası 429 HTTP durum kodunu ("Çok fazla istek") döndürür ve istekler başarısız olur.
Yeniden denemek için aşağıdaki stratejiyi öneririz:
Yeniden deneme stratejisi
Ayarlar
Değerler
Nasıl çalışır?
ExponentialBackoff
Yeniden deneme sayısı En düşük geri alma En yüksek geri alma Delta geri alma İlk hızlı yeniden deneme
5 0 sn 60 sn 2 sn false
Deneme 1 - 0 sn gecikme Deneme 2 - yaklaşık 2 sn gecikme Deneme 3 - yaklaşık 6 sn gecikme Deneme 4 - yaklaşık 14 sn gecikme Deneme 5 - yaklaşık 30 sn gecikme
Azure vm'sinde Azure kaynakları için yönetilen kimlikleri etkinleştirmek için bkz . Azure portalını kullanarak VM'de Azure kaynakları için yönetilen kimlikleri yapılandırma.
Diğer geliştiriciler ve uzmanlarla gerçek dünyadaki kullanım örneklerini temel alan ölçeklenebilir yapay zeka çözümleri oluşturmak için toplantı serisine katılın.