Aracılığıyla paylaş


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. 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. Yetkilendirme kodu akışı gibi daha güvenilir bir yöntem kullanın. Ç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 riskler 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ı gerekiyorsa, bunlar engellenir.
  • ROPC, karma kimlik federasyonu 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)). Kullanıcılar tam sayfa şirket içi kimlik sağlayıcısına yeniden yönlendiriliyorsa, Microsoft Entra Id kullanıcı adını ve parolayı bu kimlik sağlayıcısına karşı test yapamaz. Ancak doğrudan kimlik doğrulaması ROPC ile 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ı için 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 ilkesinin gizli bilgileri 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 dizileri getirme ve listeleme izinleri verin.

Test kullanıcıları oluşturma

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 Bir Bulut Uygulaması Yöneticisi olarak oturum açın.
  2. Entra ID>Users konumuna gidin.
  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 uygulama* ü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ı izleyebilir ve bu makalenin devamında yer alan örnek testte kullanılan Uygulama (istemci) kimliğini not alabilirsiniz.

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. Aç/kapa anahtarını 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. Kullandığınız API'leri çağırmak için ihtiyacınız olan izinleri ekleyin. Bu makaledeki bir test örneği ve https://graph.microsoft.com/User.Read izinlerini kullanırhttps://graph.microsoft.com/User.ReadBasic.All.

İ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 < 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 onaylayamazsınız. Ancak, bir web tarayıcısında oturum açma istemi tetikleyerek bazı izinlere onay verilmektedir.

Microsoft Entra yönetim merkezine gidin, Kimlik>Uygulamaları>Uygulama kayıtları'na> gidin Listeden uygulamanızı seçin. > Kimlik Doğrulama>Platform yapılandırmaları>Bir platform ekle>Web'e gidin. Yeniden yönlendirme URI'sini ekleyin "https://localhost"" ve Yapılandır'ı seçin.

Yönetici olmayan kullanıcıların Azure portalı aracılığıyla önkoşul oluşturmasının bir yolu yoktur, bu nedenle aşağıdaki isteği bir tarayıcıda gönderin. Oturum açma ekranı istendiğinde, ö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 yüzden test uygulamalarınızı ve kullanıcılarınızı bu gereksinimden muaf tutmanız gerekir.

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

  1. Microsoft Entra yönetim merkezinde en az Bir Bulut Uygulaması Yöneticisi olarak oturum açın.
  2. Koruma sekmesine gidin ve >Koşullu Erişim>Politikaları'na göz atın.
  3. 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ı hesabı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ını veya eylemleri 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);
    }
}