Aracılığıyla paylaş


Web API'lerini çağıran bir web uygulaması: Kod yapılandırması

Şunlar için geçerlidir: Beyaz onay işareti simgesi olan yeşil daire. İş gücü kiracılarıGri X simgesine sahip beyaz daire.Dış kiracılar (daha fazla bilgi edinin)

Önceki makalede, Microsoft Entra'da bir uygulama kaydettiniz. Bu makale, uygulama kodunu yapılandırmayı ve web uygulamanızı yalnızca kullanıcıların oturum açmasını değil, aynı zamanda web API'lerini de çağıracak şekilde nasıl değiştirebileceğinizi gösterir. Oluşturduğunuz uygulama, kullanıcıyı oturum açmak için OAuth 2.0 yetkilendirme kodu akışını kullanır. Bu akışın iki adımı vardır:

  1. Yetkilendirme kodu isteyin. Bu bölüm, kullanıcıyla özel bir diyaloğu Microsoft kimlik platformuna aktarır. Bu iletişim kutusu sırasında kullanıcı oturum açar ve web API'lerinin kullanımını onaylar. Özel iletişim kutusu başarıyla sona erdiğinde, web uygulaması yeniden yönlendirme URI'sinde bir yetkilendirme kodu alır.
  2. Yetkilendirme kodunu kullanarak API için erişim belirteci talep edin.

Önkoşullar

Web uygulamalarını destekleyen Microsoft kitaplıkları

Aşağıdaki Microsoft kitaplıkları web uygulamalarını destekler:

Dil / çerçeve Proje üzerinde çalışılıyor
GitHub (İngilizce)
Paket Elde etme
başladı
Oturum açma kullanıcıları Web API'lerine erişme Genel kullanıma açık (GA) veya
Genel önizleme1
.NET MSAL.NET Microsoft.Identity.Client Kitaplık, kullanıcı oturum açma işlemi için kimlik belirteci isteyemez. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
.NET Microsoft.IdentityModel Microsoft.IdentityModel Kitaplık, kullanıcı oturum açma işlemi için kimlik belirteci isteyemez. 2 Kitaplık, korumalı web API'leri için erişim belirteçleri isteyemez. 2 Georgia
ASP.NET Çekirdeği Microsoft.Identity.Web Microsoft.Identity.Web Hızlı Başlangıç Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
Java MSAL4J msal4j Hızlı Başlangıç Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
İlkbahar spring-cloud-azure-starter-active-directory spring-cloud-azure-starter-active-directory Eğitim Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
Node.js MSAL Düğümü msal-node Hızlı Başlangıç Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
Piton MSAL Python msal Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. Georgia
Piton kimlik kimlik Hızlı Başlangıç Kütüphane, kullanıcı oturumu açmak için kimlik belirteçleri talep edebilir. Yazılım kitaplığı, korumalı web API'leri için erişim belirteçleri isteyebilir. --

(1)Çevrimiçi Hizmetler için Evrensel Lisans Koşulları, Genel önizlemedeki kitaplıklar için geçerlidir.

(2)Microsoft.IdentityModel kitaplığı yalnızca belirteçleri doğrular ; kimlik veya erişim belirteçleri isteyemez.

İlgilendiğiniz platformun sekmesini seçin:

İstemci sırları veya istemci sertifikaları

Web uygulamanızın artık aşağı akış web API'sini çağırdığını göz önünde bulundurarak, appsettings.json dosyasında bir istemci sırrı veya istemci sertifikası sağlayın. Şunları belirten bir bölüm de ekleyebilirsiniz:

  • Aşağı akış web API'sinin URL'si
  • API'yi çağırmak için gereken kapsamlar

Aşağıdaki örnekte, GraphBeta bölümü bu ayarları belirtir.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
    {
      "SourceType": "ClientSecret",
      "ClientSecret":"[Enter_the_Client_Secret_Here]"
    }
  ]
 },
 "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
    }
}

Not

Azure Kubernetes için iş yükü kimlik federasyonu gibi kimlik bilgisi olmayan bir çözüm de dahil olmak üzere bir istemci kimlik bilgileri koleksiyonu önerebilirsiniz. Microsoft.Identity.Web'in önceki sürümleri, istemci sırrını "ClientCredentials" yerine tek bir "ClientSecret" özelliğinde belirtiyordu. Bu, geriye dönük uyumluluk için hala desteklenir, ancak hem "ClientSecret" özelliğini hem de "ClientCredentials" koleksiyonunu kullanamazsınız.

İstemci sırrı yerine bir istemci sertifikası sağlayabilirsiniz. Aşağıdaki kod parçacığı, Azure Key Vault'ta depolanan bir sertifikanın kullanılmasını gösterir.

{
  "AzureAd": {
    "Instance": "https://login.microsoftonline.com/",
    "ClientId": "[Enter_the_Application_Id_Here]",
    "TenantId": "common",

   // To call an API
   "ClientCredentials": [
      {
        "SourceType": "KeyVault",
        "KeyVaultUrl": "https://msidentitywebsamples.vault.azure.net",
        "KeyVaultCertificateName": "MicrosoftIdentitySamplesCert"
      }
   ]
  },
  "GraphBeta": {
    "BaseUrl": "https://graph.microsoft.com/beta",
    "Scopes": ["user.read"]
  }
}

Uyarı

Eğer Scopes değerini bir dizi olarak değiştirmeyi unutursanız, IDownstreamApi kullanmaya çalıştığınızda kapsamlar null olarak görünür ve IDownstreamApi aşağı akış API'sine anonim (kimliği doğrulanmamış) bir çağrı yapmaya çalışır, bu da 401/unauthenticated ile sonuçlanır.

Microsoft.Identity.Web , sertifikaları hem yapılandırmaya hem de koda göre açıklamanın çeşitli yollarını sağlar. Ayrıntılar için bkz . Microsoft.Identity.Web - GitHub'da sertifikaları kullanma.

Startup.cs dosyasını değiştirme

Web uygulamanızın aşağı akış API'sine yönelik bir belirteç alması gerekir. .EnableTokenAcquisitionToCallDownstreamApi() satırının arkasına .AddMicrosoftIdentityWebApp(Configuration) ekleyerek bunu belirtirsiniz. Bu satır, IAuthorizationHeaderProvider denetleyicinizde ve sayfa eylemlerinizde kullanabileceğiniz hizmeti kullanıma sunar. Ancak, aşağıdaki iki seçenekte gördüğünüz gibi, daha basit bir şekilde yapılabilir. Ayrıca, Startup.cs'de .AddInMemoryTokenCaches()bir belirteç önbelleği uygulaması seçmeniz de gerekir:

using Microsoft.Identity.Web;

public class Startup
{
  // ...
  public void ConfigureServices(IServiceCollection services)
  {
  // ...
  services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
          .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
            .AddInMemoryTokenCaches();
   // ...
  }
  // ...
}

EnableTokenAcquisitionToCallDownstreamApi'e geçirilen kapsamlar isteğe bağlıdır ve web uygulamanızın, kullanıcı oturum açarken bu kapsamları ve kullanıcının bu kapsamlar için onayını talep etmesine olanak tanır. Kapsamları belirtmezseniz, Microsoft.Identity.Web artımlı bir onay deneyimi sağlar.

Microsoft.Identity.Web , belirteç almanıza gerek kalmadan bir web uygulamasından web API'sini çağırmak için iki mekanizma sunar. Seçtiğiniz seçenek, Microsoft Graph'ı mı yoksa başka bir API'yi mi çağırmak istediğinize bağlıdır.

1. Seçenek: Microsoft Graph'ı çağırma

Microsoft Graph'ı çağırmak istiyorsanız, Microsoft.Identity.Web, API eylemlerinizde Microsoft Graph SDK'sı tarafından kullanıma sunulan GraphServiceClient'yi doğrudan kullanmanıza olanak tanır. Microsoft Graph'ı kullanıma açmak için:

  1. Projenize Microsoft.Identity.Web.GraphServiceClient NuGet paketini ekleyin.

  2. Startup.cs dosyasında .AddMicrosoftGraph()'nin ardından .EnableTokenAcquisitionToCallDownstreamApi() ekleyin. .AddMicrosoftGraph() birkaç geçersiz kılma içerir. Yapılandırma bölümünü parametre olarak alan override kullanıldığında kod şöyle değişir:

    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddMicrosoftGraph(Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Seçenek 2: Microsoft Graph dışında bir aşağı akış web API'sini çağırma

Microsoft Graph dışında bir API çağırmak istiyorsanız, Microsoft.Identity.Web API eylemlerinizde arabirimi kullanmanıza IDownstreamApi olanak tanır. Bu arabirimi kullanmak için:

  1. Projenize Microsoft.Identity.Web.DownstreamApi NuGet paketini ekleyin.

  2. Startup.cs dosyasında .AddDownstreamApi()'nin ardından .EnableTokenAcquisitionToCallDownstreamApi() ekleyin. .AddDownstreamApi() iki bağımsız değişkeni vardır ve aşağıdaki kod parçacığında gösterilir:

    • Denetleyici eylemlerinizde karşılık gelen yapılandırmaya başvurmak için kullanılan bir hizmetin (API) adı
    • aşağı akış web API'sini çağırmak için kullanılan parametreleri temsil eden bir yapılandırma bölümü.
    using Microsoft.Identity.Web;
    
    public class Startup
    {
      // ...
      public void ConfigureServices(IServiceCollection services)
      {
      // ...
      services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
              .AddMicrosoftIdentityWebApp(Configuration, "AzureAd")
                .EnableTokenAcquisitionToCallDownstreamApi(new string[]{"user.read" })
                   .AddDownstreamApi("MyApi", Configuration.GetSection("GraphBeta"))
                .AddInMemoryTokenCaches();
       // ...
      }
      // ...
    }
    

Özet

Web API'lerinde olduğu gibi çeşitli belirteç önbelleği uygulamalarını seçebilirsiniz. Ayrıntılar için bkz . GitHub'da Microsoft.Identity.Web - Belirteç önbelleği serileştirmesi .

Aşağıdaki görüntüde Microsoft.Identity.Web'in çeşitli olasılıkları ve bunların Startup.cs dosyası üzerindeki etkisi gösterilmektedir:

Web API'sini çağırmak ve belirteç önbelleği uygulaması belirtmek için başlangıç noktası C S'deki hizmet yapılandırma seçeneklerini gösteren blok diyagramı

Not

Buradaki kod örneklerini tam olarak anlamak için ASP.NET Core temelleri ve özellikle bağımlılık ekleme ve seçenekleri hakkında bilgi sahibi olun.

Yetkilendirme kodunu doğrulayan kod

Microsoft.Identity.Web, doğru OpenID Connect ayarlarını yaparak, alınan kod olayına abone olur ve kodu kullanarak kodunuzu basitleştirir. Yetkilendirme kodunu kullanmak için ek kod gerekmez. Bunun nasıl çalıştığı hakkında ayrıntılı bilgi için bkz . Microsoft.Identity.Web kaynak kodu .

Gizli istemci uygulaması, istemci sırrı yerine istemci sertifikası veya istemci beyanı kullanarak kimliğini de kanıtlayabilir. İstemci onaylarının kullanımı, İstemci onayları bölümünde ayrıntılı olarak yer alan gelişmiş bir senaryodur.

Jeton önbelleği

Önemli

Web uygulamaları veya web API'leri için belirteç önbelleği uygulaması, genellikle dosya tabanlı olan masaüstü uygulamaları için uygulamadan farklıdır. Güvenlik ve performans nedenleriyle, web uygulamaları ve web API'leri için kullanıcı hesabı başına bir belirteç önbelleği olduğundan emin olmak önemlidir. Her hesap için belirteç önbelleğini seri hale getirmeniz gerekir.

ASP.NET temel öğreticisi, uygulamanızın Startup.cs dosyasında belirteç önbelleği uygulamasına karar vermenize olanak sağlamak için bağımlılık eklemeyi kullanır. Microsoft.Identity.Web, Belirteç önbelleği serileştirmesi bölümünde açıklanan önceden oluşturulmuş belirteç önbelleği serileştiricileriyle birlikte gelir. İlginç bir olasılık ASP.NET Çekirdek dağıtılmış bellek önbelleklerini seçmektir:

// Use a distributed token cache by adding:
    services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAd")
            .EnableTokenAcquisitionToCallDownstreamApi(
                initialScopes: new string[] { "user.read" })
            .AddDistributedTokenCaches();

// Then, choose your implementation.
// For instance, the distributed in-memory cache (not cleared when you stop the app):
services.AddDistributedMemoryCache();

// Or a Redis cache:
services.AddStackExchangeRedisCache(options =>
{
 options.Configuration = "localhost";
 options.InstanceName = "SampleInstance";
});

// Or even a SQL Server token cache:
services.AddDistributedSqlServerCache(options =>
{
 options.ConnectionString = _config["DistCache_ConnectionString"];
 options.SchemaName = "dbo";
 options.TableName = "TestCache";
});

Belirteç önbelleği sağlayıcıları hakkında ayrıntılı bilgi için Microsoft.Identity.Web'in Belirteç önbelleği serileştirme makalesine ve ASP.NET Core web uygulaması öğreticilerinin Belirteç önbellekleri aşamasına da bakın.

Sonraki adım

Bu noktada, kullanıcı oturum açtığında belirteç, belirteç önbelleğinde depolanır. Şimdi web uygulamasının diğer bölümlerinde nasıl kullanıldığını görelim.

Genel oturum kapatma sırasında hesapları önbellekten kaldırın.