Otomatik tümleştirme testleri çalıştırma

Geliştirici olarak, geliştirdiğiniz uygulamalarda otomatik tümleştirme testleri çalıştırmak istiyorsunuz. Api'nizi Microsoft kimlik platformu (veya Microsoft Graph gibi diğer korumalı API'ler) tarafından otomatik tümleştirme testlerinde çağırmak zor bir işlemdir. Microsoft Entra Id genellikle otomatikleştirilmesi zor olan etkileşimli bir kullanıcı oturum açma istemi gerektirir. Bu makalede, kullanıcıları test etmek üzere otomatik olarak oturum açmak için Kaynak Sahibi Parola Kimlik Bilgisi Verme (ROPC) adlı etkileşimli olmayan bir akışı nasıl kullanabileceğiniz açıklanmaktadır.

Otomatik tümleştirme testlerinize hazırlanmak için bazı test kullanıcıları oluşturun, bir uygulama kaydı oluşturup yapılandırın ve potansiyel olarak kiracınızda bazı yapılandırma değişiklikleri yapın. Bu adımlardan bazıları yönetici ayrıcalıkları gerektirir. Ayrıca Microsoft, ROPC akışını üretim ortamında kullanmamanızı önerir. Otomatik tümleştirme testlerinizi güvenli ve etkili bir şekilde çalıştırabilmek için yöneticisi olduğunuz ayrı bir test kiracısı oluşturun.

Uyarı

Microsoft, ROPC akışını üretim ortamında kullanmamanızı önerir. Çoğu üretim senaryosunda daha güvenli alternatifler kullanılabilir ve önerilir. ROPC akışı, uygulamada çok yüksek düzeyde güven gerektirir ve diğer kimlik doğrulama akışlarında bulunmayan riskleri taşır. Bu akışı yalnızca ayrı bir test kiracısında ve yalnızca test kullanıcılarıyla test amacıyla kullanmanız gerekir.

Önemli

  • Microsoft kimlik platformu yalnızca Microsoft Entra kiracılarında ROPC'yi destekler, kişisel hesapları desteklemez. Bu, kiracıya özgü bir uç nokta (https://login.microsoftonline.com/{TenantId_or_Name}) veya organizations uç nokta kullanmanız gerektiği anlamına gelir.
  • Bir Microsoft Entra kiracısına davet edilen kişisel hesaplar ROPC'yi kullanamaz.
  • Parolası olmayan hesaplar ROPC ile oturum açamaz; bu da SMS oturum açma, FIDO ve Authenticator uygulaması gibi özelliklerin bu akışla çalışmayabileceği anlamına gelir.
  • Kullanıcıların uygulamada oturum açmak için çok faktörlü kimlik doğrulaması (MFA) kullanması gerekirse, bu kullanıcılar engellenir.
  • ROPC, karma kimlik federasyon senaryolarında desteklenmez (örneğin, şirket içi hesapların kimliğini doğrulamak için kullanılan Microsoft Entra Id ve Active Directory Federasyon Hizmetleri (AD FS) (AD FS). Kullanıcılar şirket içi kimlik sağlayıcıya tam sayfa yönlendirmesiyle karşılaşırsa Microsoft Entra Kimliği söz konusu kimlik sağlayıcısında kullanıcı adı ve parolayı test edemez. Öte yandan ROPC ile geçiş kimlik doğrulaması desteklenir.
  • Karma kimlik federasyon senaryosu için bir özel durum şu olabilir: AllowCloudPasswordValidation değeri TRUE olarak ayarlanmış Olan Giriş Bölgesi Bulma ilkesi, şirket içi parola bulutla eşitlendiğinde ROPC akışının federasyon kullanıcıları için çalışmasını sağlar. Daha fazla bilgi için bkz. Eski uygulamalar için federasyon kullanıcılarının doğrudan ROPC kimlik doğrulamasını etkinleştirme .

Ayrı bir test kiracısı oluşturma

ROPC kimlik doğrulama akışının kullanılması üretim ortamında risklidir, bu nedenle uygulamalarınızı test etmek için ayrı bir kiracı oluşturun. Mevcut bir test kiracısını kullanabilirsiniz, ancak aşağıdaki adımlardan bazıları yönetici ayrıcalıkları gerektirdiğinden kiracıda yönetici olmanız gerekir.

Anahtar kasası oluşturma ve yapılandırma

Test kullanıcı adlarını ve parolalarını Azure Key Vault'ta gizli dizi olarak güvenli bir şekilde depolamanızı öneririz. Testleri daha sonra çalıştırdığınızda, testler bir güvenlik sorumlusu bağlamında çalışır. Güvenlik sorumlusu, testleri yerel olarak çalıştırıyorsanız (örneğin, Visual Studio veya Visual Studio Code'da) bir Microsoft Entra kullanıcısı ya da Azure Pipelines'da veya başka bir Azure kaynağında test çalıştırıyorsanız bir hizmet sorumlusu veya yönetilen kimliktir. Test çalıştırıcısının anahtar kasanızdan test kullanıcı adlarını ve parolalarını alabilmesi için güvenlik sorumlusunun Gizli dizileri okuma ve listeleme izinlerine sahip olması gerekir. Daha fazla bilgi için bkz . Azure Key Vault'ta kimlik doğrulaması.

  1. Henüz bir anahtar kasanız yoksa yeni bir anahtar kasası oluşturun.
  2. Bu makalenin devamında yer alan örnek testte kullanılan Vault URI özellik değerini (benzeri https://<your-unique-keyvault-name>.vault.azure.net/) not edin.
  3. Testleri çalıştıran güvenlik sorumlusu için bir erişim ilkesi atayın. Anahtar kasasında kullanıcıya, hizmet sorumlusuna veya yönetilen kimliğe gizli dizi alma ve listeleme izinleri verin.

Test kullanıcıları oluşturma

Bahşiş

Bu makaledeki adımlar, başladığınız portala göre biraz değişiklik gösterebilir.

Test için kiracınızda bazı test kullanıcıları oluşturun. Test kullanıcıları gerçek insanlar olmadığından, karmaşık parolalar atamanızı ve bu parolaları Azure Key Vault'ta gizli dizi olarak güvenli bir şekilde depolamanızı öneririz.

  1. Microsoft Entra yönetim merkezinde en az Bulut Uygulaması Yönetici istrator olarak oturum açın.
  2. Kimlik>Kullanıcıları Tüm kullanıcılar'a> göz atın.
  3. Yeni kullanıcı'ya tıklayın ve dizininizde bir veya daha fazla test kullanıcısı hesabı oluşturun.
  4. Bu makalenin devamında yer alan örnek test, tek bir test kullanıcısı kullanır. Test kullanıcı adını ve parolayı daha önce oluşturduğunuz anahtar kasasına gizli dizi olarak ekleyin. Kullanıcı adını "TestUserName" adlı gizli dizi olarak ve parolayı "TestPassword" adlı gizli dizi olarak ekleyin.

Uygulama kaydı oluşturma ve yapılandırma

Test sırasında API'leri çağırırken istemci uygulamanız gibi davranan bir uygulamayı kaydedin. Bu, üretimde zaten sahip olabileceğiniz uygulamayla aynı olmamalıdır. Yalnızca test amacıyla kullanmak için ayrı bir uygulamanız olmalıdır.

Bir uygulamayı kaydetme

Uygulama kaydı oluşturun. Uygulama kaydı hızlı başlangıcındaki adımları izleyebilirsiniz. Bu bölümleri atlayabileceğiniz için yeniden yönlendirme URI'sini eklemeniz veya kimlik bilgileri eklemeniz gerekmez.

Bu makalenin devamında yer alan örnek testte kullanılan Uygulama (istemci) kimliğini not alın.

Uygulamanızı genel istemci akışları için etkinleştirme

ROPC bir genel istemci akışı olduğundan uygulamanızı genel istemci akışları için etkinleştirmeniz gerekir. Microsoft Entra yönetim merkezindeki uygulama kaydınızdan Kimlik Doğrulaması>Gelişmiş ayarları>Genel istemci akışlarına izin ver'e gidin. İki durumlu düğmeyi Evet olarak ayarlayın.

ROPC etkileşimli bir akış olmadığından, çalışma zamanında bunları onaylamanız için bir onay ekranı istenmez. Belirteçleri alırken hatalardan kaçınmak için izinlere önceden onay verin.

İzinleri uygulamanıza ekleyin. Uygulamaya herhangi bir hassas veya yüksek ayrıcalıklı izin eklemeyin, test senaryolarınızı Microsoft Entra ID ile tümleştirmeyle ilgili temel tümleştirme senaryolarıyla kapsamanızı öneririz.

Microsoft Entra yönetim merkezindeki uygulama kaydınızdan API İzinleri>İzin ekle'ye gidin. Kullanmakta olduğunuz API'leri çağırmak için ihtiyacınız olan izinleri ekleyin. Bu makaledeki bir test örneği ve https://graph.microsoft.com/User.ReadBasic.All izinlerini kullanırhttps://graph.microsoft.com/User.Read.

İzinler eklendikten sonra bunlara onay vermeniz gerekir. İzinleri onaylama şekliniz, test uygulamanızın uygulama kaydıyla aynı kiracıda olup olmadığına ve kiracıda yönetici olup olmadığınıza bağlıdır.

Uygulama ve uygulama kaydı aynı kiracıdadır ve siz yöneticisiniz

Uygulamanızı kaydettiğiniz kiracıda sınamayı planlıyorsanız ve bu kiracıda yöneticiyseniz, Microsoft Entra yönetim merkezinden izinleri onaylayabilirsiniz. Azure portalındaki uygulama kaydınızda API İzinleri'ne gidin ve İzin ekle düğmesinin yanındaki your_tenant_name> için <yönetici onayı ver düğmesini ve onaylamak için Evet'i seçin.

Uygulama ve uygulama kaydı farklı kiracılarda veya yönetici değilsiniz

Uygulamanızı kaydettiğiniz kiracıda sınamayı planlamıyorsanız veya kiracınızda yönetici değilseniz, Microsoft Entra yönetim merkezinden izinleri kabul edemezsiniz. Ancak, bir web tarayıcısında oturum açma istemi tetikleyerek bazı izinlere onay verilmektedir.

Microsoft Entra yönetim merkezinde uygulama kaydınızda, Kimlik Doğrulama>Platformu yapılandırmaları>Platform>Web'i ekleme'ye gidin. Yeniden yönlendirme URI'sini ekleyin "https://localhost" ve Yapılandır'ı seçin.

Yönetici olmayan kullanıcıların Azure portalı üzerinden ön onay vermelerinin bir yolu yoktur, bu nedenle aşağıdaki isteği bir tarayıcıda gönderin. Oturum açma ekranı sorulduğunda, önceki adımda oluşturduğunuz bir test hesabıyla oturum açın. sizden istenen izinlere onay verin. Çağırmak istediğiniz her API için bu adımı yinelemeniz ve kullanmak istediğiniz kullanıcıyı test etmeniz gerekebilir.

// Line breaks for legibility only

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={your_client_ID}
&response_type=code
&redirect_uri=https://localhost
&response_mode=query
&scope={resource_you_want_to_call}/.default
&state=12345

{tenant} öğesini kiracı kimliğinizle, {your_client_ID} öğesini uygulamanızın istemci kimliğiyle ve {resource_you_want_to_call} öğesini tanımlayıcı URI'si ile değiştirin (örneğin, "https://graph.microsoft.com") veya erişmeye çalıştığınız API'nin uygulama kimliği.

Test uygulamalarını ve kullanıcıları MFA ilkenizin dışında tutma

Kiracınızın büyük olasılıkla Microsoft tarafından önerilen şekilde tüm kullanıcılar için çok faktörlü kimlik doğrulaması (MFA) gerektiren bir Koşullu Erişim ilkesi vardır. MFA, ROPC ile çalışmaz, bu nedenle test uygulamalarınızı muaf tutmanız ve kullanıcıları bu gereksinimden muaf tutmanız gerekir.

Kullanıcı hesaplarını dışlamak için:

  1. Microsoft Entra yönetim merkezinde en az Bulut Uygulaması Yönetici istrator olarak oturum açın.
  2. Sol gezinti bölmesinde Kimlik>Güvenlik Merkezi'ne gidin ve Koşullu Erişim'i seçin.
  3. İlkeler'de MFA gerektiren Koşullu Erişim ilkesini seçin.
  4. Kullanıcılar veya iş yükü kimlikleri'ne tıklayın.
  5. Dışla sekmesini ve ardından Kullanıcılar ve gruplar onay kutusunu seçin.
  6. Dışlanan kullanıcıları seçin bölümünde hariç tutulacak kullanıcı hesaplarını seçin.
  7. Seç düğmesini ve ardından Kaydet'i seçin.

Test uygulamasını dışlamak için:

  1. İlkeler'de MFA gerektiren Koşullu Erişim ilkesini seçin.
  2. Bulut uygulamaları veya eylemleri’ni seçin.
  3. Dışla sekmesini ve ardından Dışlanan bulut uygulamalarını seçin.
  4. Dışlanan bulut uygulamalarını seçin bölümünde dışlamak istediğiniz uygulamaları seçin.
  5. Seç düğmesini ve ardından Kaydet'i seçin.

Uygulama testlerinizi yazma

Artık ayarladığınıza göre otomatikleştirilmiş testlerinizi yazabilirsiniz. Aşağıdakiler için testlerdir:

  1. .NET örnek kodu Microsoft Authentication Library (MSAL) ve ortak bir test çerçevesi olan xUnit'i kullanır.
  2. JavaScript örnek kodu, yaygın bir test çerçevesi olan Microsoft Authentication Library (MSAL) ve Playwright'ı kullanır.

appsettings.json dosyanızı ayarlama

Daha önce oluşturduğunuz test uygulamasının istemci kimliğini, gerekli kapsamları ve anahtar kasası URI'sini test projenizin appsettings.json dosyasına ekleyin.

{
  "Authentication": {
    "AzureCloudInstance": "AzurePublic", //Will be different for different Azure clouds, like US Gov
    "AadAuthorityAudience": "AzureAdMultipleOrgs",
    "ClientId": <your_client_ID>
  },

  "WebAPI": {
    "Scopes": [
      //For this Microsoft Graph example.  Your value(s) will be different depending on the API you're calling
      "https://graph.microsoft.com/User.Read",
      //For this Microsoft Graph example.  Your value(s) will be different depending on the API you're calling
      "https://graph.microsoft.com/User.ReadBasic.All"
    ]
  },

  "KeyVault": {
    "KeyVaultUri": "https://<your-unique-keyvault-name>.vault.azure.net//"
  }
}

İstemcinizi tüm test sınıflarınızda kullanmak üzere ayarlama

Azure Key Vault'tan test kullanıcı adını ve parola gizli dizilerini almak için SecretClient() kullanın. Kod, Key Vault'un kısıtlanma olasılığına karşı yeniden denemeler için üstel geri alma kullanır.

DefaultAzureCredential() , ortam değişkenleri veya yönetilen kimlik tarafından yapılandırılan bir hizmet sorumlusundan erişim belirteci alarak Azure Key Vault ile kimlik doğrulaması yapar (kod yönetilen kimliği olan bir Azure kaynağında çalışıyorsa). Kod yerel olarak çalışıyorsa, DefaultAzureCredential yerel kullanıcının kimlik bilgilerini kullanır. Azure Identity istemci kitaplığı içeriğinde daha fazla bilgi edinin.

ROPC akışını kullanarak kimlik doğrulaması yapmak ve erişim belirteci almak için Microsoft Kimlik Doğrulama Kitaplığı'nı (MSAL) kullanın. Erişim belirteci, HTTP isteğinde taşıyıcı belirteç olarak geçirilir.

using Xunit;
using System.Threading.Tasks;
using Microsoft.Identity.Client;
using System.Security;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using Microsoft.Extensions.Configuration;
using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;
using System;

public class ClientFixture : IAsyncLifetime
{
    public HttpClient httpClient;

    public async Task InitializeAsync()
    {
        var builder = new ConfigurationBuilder().AddJsonFile("<path-to-json-file>");

        IConfigurationRoot Configuration = builder.Build();

        var PublicClientApplicationOptions = new PublicClientApplicationOptions();
        Configuration.Bind("Authentication", PublicClientApplicationOptions);
        var app = PublicClientApplicationBuilder.CreateWithApplicationOptions(PublicClientApplicationOptions)
            .Build();

        SecretClientOptions options = new SecretClientOptions()
        {
            Retry =
                {
                    Delay= TimeSpan.FromSeconds(2),
                    MaxDelay = TimeSpan.FromSeconds(16),
                    MaxRetries = 5,
                    Mode = RetryMode.Exponential
                 }
        };

        string keyVaultUri = Configuration.GetValue<string>("KeyVault:KeyVaultUri");
        var client = new SecretClient(new Uri(keyVaultUri), new DefaultAzureCredential(), options);

        KeyVaultSecret userNameSecret = client.GetSecret("TestUserName");
        KeyVaultSecret passwordSecret = client.GetSecret("TestPassword");

        string password = passwordSecret.Value;
        string username = userNameSecret.Value;
        string[] scopes = Configuration.GetSection("WebAPI:Scopes").Get<string[]>();
        SecureString securePassword = new NetworkCredential("", password).SecurePassword;

        AuthenticationResult result = null;
        httpClient = new HttpClient();

        try
        {
            result = await app.AcquireTokenByUsernamePassword(scopes, username, securePassword)
                .ExecuteAsync();
        }
        catch (MsalException) { }

        string accessToken = result.AccessToken;
        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
    }

    public Task DisposeAsync() => Task.CompletedTask;
}

Test sınıflarınızda kullanma

Aşağıdaki örnek, Microsoft Graph'i çağıran bir testtir. Bu testi kendi uygulamanızda veya API'nizde test etmek istediğiniz testle değiştirin.

public class ApiTests : IClassFixture<ClientFixture>
{
    ClientFixture clientFixture;

    public ApiTests(ClientFixture clientFixture)
    {
        this.clientFixture = clientFixture;
    }

    [Fact]
    public async Task GetRequestTest()
    {
        var testClient = clientFixture.httpClient;
        HttpResponseMessage response = await testClient.GetAsync("https://graph.microsoft.com/v1.0/me");
        var responseCode = response.StatusCode.ToString();
        Assert.Equal("OK", responseCode);
    }
}