Uruchamianie testów automatycznej integracji

Jako deweloper chcesz uruchamiać zautomatyzowane testy integracji w opracowywanych aplikacjach. Wywoływanie interfejsu API chronionego przez Platforma tożsamości Microsoft (lub inne chronione interfejsy API, takie jak Program Microsoft Graph) w automatycznych testach integracji, jest wyzwaniem. Identyfikator Entra firmy Microsoft często wymaga interakcyjnego monitu logowania użytkownika, który jest trudny do zautomatyzowania. W tym artykule opisano sposób użycia przepływu nieinterakcyjnego o nazwie Grant poświadczeń hasła właściciela zasobu (ROPC) w celu automatycznego logowania użytkowników do testowania.

Aby przygotować się do testów automatycznej integracji, utwórz i skonfiguruj rejestrację aplikacji dla niektórych użytkowników testowych, a potencjalnie wprowadź pewne zmiany konfiguracji w dzierżawie. Niektóre z tych kroków wymagają uprawnień administratora. Ponadto firma Microsoft zaleca, aby nie używać przepływu ROPC w środowisku produkcyjnym. Utwórz oddzielną dzierżawę testową, której jesteś administratorem, aby można było bezpiecznie i skutecznie uruchamiać zautomatyzowane testy integracji.

Ostrzeżenie

Firma Microsoft zaleca, aby nie używać przepływu ROPC w środowisku produkcyjnym. W większości scenariuszy produkcyjnych dostępne są i zalecane bezpieczniejsze alternatywy. Przepływ ROPC wymaga bardzo wysokiego poziomu zaufania w aplikacji i niesie ze sobą ryzyko, które nie występują w innych przepływach uwierzytelniania. Ten przepływ należy używać tylko do celów testowych w oddzielnej dzierżawie testowej i tylko dla użytkowników testowych.

Ważne

  • Platforma tożsamości Microsoft obsługuje tylko ropc w dzierżawach firmy Microsoft, a nie kontach osobistych. Oznacza to, że należy użyć punktu końcowego specyficznego dla dzierżawy (https://login.microsoftonline.com/{TenantId_or_Name}) lub punktu końcowego organizations .
  • Konta osobiste, które są zapraszane do dzierżawy usługi Microsoft Entra, nie mogą używać rozwiązania ROPC.
  • Konta, które nie mają haseł, nie mogą zalogować się przy użyciu rozwiązania ROPC, co oznacza, że funkcje takie jak logowanie sms, fiDO i aplikacja Authenticator nie będą działać z tym przepływem.
  • Użytkownicy zostaną zablokowani, jeśli będą musieli logować się w aplikacji przy użyciu uwierzytelniania wieloskładnikowego (MFA).
  • RopC nie jest obsługiwany w scenariuszach federacji tożsamości hybrydowej (na przykład Microsoft Entra ID i Active Directory Federation Services (AD FS) używanych do uwierzytelniania kont lokalnych. Jeśli użytkownicy są przekierowywani do lokalnych dostawców tożsamości, usługa Microsoft Entra nie może przetestować nazwy użytkownika ani hasła względem tego dostawcy tożsamości. Natomiast przepływ ROPC obsługuje uwierzytelnianie z przekazywaniem.
  • Wyjątek od scenariusza federacji tożsamości hybrydowej będzie następujący: Zasady odnajdywania obszaru głównego z ustawieniem AllowCloudPasswordValidation ustawioną na wartość TRUE umożliwią działanie przepływu ROPC dla użytkowników federacyjnych, gdy lokalne hasło jest synchronizowane z chmurą. Aby uzyskać więcej informacji, zobacz temat Włączanie bezpośredniego uwierzytelniania ROPC użytkowników federacyjnych w przypadku starszych aplikacji.

Tworzenie oddzielnej dzierżawy testowej

Korzystanie z przepływu uwierzytelniania ROPC jest ryzykowne w środowisku produkcyjnym, dlatego utwórz oddzielną dzierżawę do testowania aplikacji. Możesz użyć istniejącej dzierżawy testowej, ale musisz być administratorem w dzierżawie, ponieważ niektóre z poniższych kroków wymagają uprawnień administratora.

Tworzenie i konfigurowanie magazynu kluczy

Zalecamy bezpieczne przechowywanie testowych nazw użytkowników i haseł jako wpisów tajnych w usłudze Azure Key Vault. Po uruchomieniu testów testy są uruchamiane w kontekście podmiotu zabezpieczeń. Podmiot zabezpieczeń jest użytkownikiem firmy Microsoft Entra, jeśli uruchamiasz testy lokalnie (na przykład w programie Visual Studio lub Visual Studio Code), albo jednostką usługi lub tożsamością zarządzaną, jeśli uruchamiasz testy w usłudze Azure Pipelines lub innym zasobie platformy Azure. Podmiot zabezpieczeń musi mieć uprawnienia Odczyt i Lista wpisów tajnych, aby moduł uruchamiający test mógł uzyskać nazwy użytkownika i hasła testowe z magazynu kluczy. Aby uzyskać więcej informacji, zobacz Authentication in Azure Key Vault (Uwierzytelnianie w usłudze Azure Key Vault).

  1. Utwórz nowy magazyn kluczy, jeśli jeszcze go nie masz.
  2. Zanotuj wartość właściwości identyfikatora URI magazynu (podobną do https://<your-unique-keyvault-name>.vault.azure.net/), która jest używana w przykładowym teście w dalszej części tego artykułu.
  3. Przypisz zasady dostępu dla podmiotu zabezpieczeń uruchamiającego testy. Udziel użytkownikowi, jednostce usługi lub tożsamości zarządzanej uprawnień Uzyskiwanie i wyświetlanie wpisów tajnych w magazynie kluczy.

Tworzenie użytkowników testowych

Napiwek

Kroki opisane w tym artykule mogą się nieznacznie różnić w zależności od portalu, od którego zaczynasz.

Utwórz niektórych użytkowników testowych w dzierżawie na potrzeby testowania. Ponieważ użytkownicy testowi nie są rzeczywistymi ludźmi, zalecamy przypisanie złożonych haseł i bezpieczne przechowywanie tych haseł jako wpisów tajnych w usłudze Azure Key Vault.

  1. Zaloguj się do centrum administracyjnego firmy Microsoft Entra jako co najmniej Administracja istrator aplikacji w chmurze.
  2. Przejdź do pozycji Użytkownicy tożsamości>>Wszyscy użytkownicy.
  3. Wybierz pozycję Nowy użytkownik i utwórz co najmniej jedno testowe konto użytkownika w katalogu.
  4. Przykładowy test w dalszej części tego artykułu używa pojedynczego użytkownika testowego. Dodaj testową nazwę użytkownika i hasło jako wpisy tajne w utworzonym wcześniej magazynie kluczy. Dodaj nazwę użytkownika jako wpis tajny o nazwie "TestUserName" i hasło jako wpis tajny o nazwie "TestPassword".

Tworzenie i konfigurowanie rejestracji aplikacji

Zarejestruj aplikację, która działa jako aplikacja kliencka podczas wywoływania interfejsów API podczas testowania. Nie powinno to być ta sama aplikacja, która mogła być już w środowisku produkcyjnym. Do celów testowych powinna być używana oddzielna aplikacja.

Rejestrowanie aplikacji

Tworzenie rejestracji aplikacji. Możesz wykonać kroki opisane w przewodniku Szybki start dotyczący rejestracji aplikacji. Nie musisz dodawać identyfikatora URI przekierowania ani dodawać poświadczeń, aby pominąć te sekcje.

Zanotuj identyfikator aplikacji (klienta), który jest używany w przykładowym teście w dalszej części tego artykułu.

Włączanie aplikacji dla przepływów klientów publicznych

ROPC to publiczny przepływ klienta, więc musisz włączyć aplikację dla przepływów klientów publicznych. Z poziomu rejestracji aplikacji w centrum administracyjnym firmy Microsoft Entra przejdź do pozycji Ustawienia>zaawansowane uwierzytelniania>Zezwalaj na przepływy klientów publicznych. Ustaw przełącznik na Wartość Tak.

Ponieważ ropc nie jest przepływem interaktywnym, nie zostanie wyświetlony monit z ekranem zgody, aby wyrazić zgodę na te dane w czasie wykonywania. Wstępna zgoda na uprawnienia, aby uniknąć błędów podczas uzyskiwania tokenów.

Dodaj uprawnienia do aplikacji. Nie dodawaj żadnych poufnych lub wysokich uprawnień do aplikacji. Zalecamy określanie zakresu scenariuszy testowania do podstawowych scenariuszy integracji wokół integracji z identyfikatorem Entra firmy Microsoft.

Z poziomu rejestracji aplikacji w centrum administracyjnym firmy Microsoft Entra przejdź do pozycji Uprawnienia>interfejsu API Dodaj uprawnienie. Dodaj uprawnienia potrzebne do wywoływania interfejsów API, których będziesz używać. W przykładzie testowym w tym artykule użyto https://graph.microsoft.com/User.Read uprawnień i https://graph.microsoft.com/User.ReadBasic.All .

Po dodaniu uprawnień musisz wyrazić na nie zgodę. Sposób wyrażania zgody na uprawnienia zależy od tego, czy aplikacja testowa znajduje się w tej samej dzierżawie co rejestracja aplikacji i czy jesteś administratorem w dzierżawie.

Rejestracja aplikacji i aplikacji znajduje się w tej samej dzierżawie i jesteś administratorem

Jeśli planujesz testowanie aplikacji w tej samej dzierżawie, w której została zarejestrowana, i jesteś administratorem tej dzierżawy, możesz wyrazić zgodę na uprawnienia z centrum administracyjnego firmy Microsoft Entra. W rejestracji aplikacji w witrynie Azure Portal przejdź do pozycji Uprawnienia interfejsu API i wybierz przycisk Udziel zgody administratora dla <your_tenant_name> obok przycisku Dodaj uprawnienie, a następnie pozycję Tak, aby potwierdzić.

Rejestracja aplikacji i aplikacji znajduje się w różnych dzierżawach lub nie jesteś administratorem

Jeśli nie planujesz testowania aplikacji w tej samej dzierżawie, w której została zarejestrowana, lub nie jesteś administratorem w dzierżawie, nie możesz wyrazić zgody na uprawnienia z centrum administracyjnego firmy Microsoft Entra. Nadal możesz wyrazić zgodę na niektóre uprawnienia, wyzwalając jednak monit logowania w przeglądarce internetowej.

W rejestracji aplikacji w centrum administracyjnym firmy Microsoft Entra przejdź do pozycji Konfiguracje platformy>uwierzytelniania>Dodaj sieć Web platformy>. Dodaj identyfikator URI przekierowania "https://localhost" i wybierz pozycję Konfiguruj.

Nie ma możliwości, aby użytkownicy niebędący administratorami mogli wstępnie wyrazić zgodę za pośrednictwem witryny Azure Portal, dlatego wyślij następujące żądanie w przeglądarce. Po wyświetleniu monitu przy użyciu ekranu logowania zaloguj się przy użyciu konta testowego utworzonego w poprzednim kroku. Zgoda na uprawnienia, za pomocą których zostanie wyświetlony monit. Może być konieczne powtórzenie tego kroku dla każdego interfejsu API, którego chcesz wywołać i przetestować użytkownika, którego chcesz użyć.

// 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

Zastąp ciąg {tenant} identyfikatorem dzierżawy { your_client_ID} identyfikatorem klienta aplikacji i {resource_you_want_to_call} identyfikatorem URI (na przykład "https://graph.microsoft.com") lub identyfikator aplikacji interfejsu API, do którego próbujesz uzyskać dostęp.

Wykluczanie aplikacji testowych i użytkowników z zasad uwierzytelniania wieloskładnikowego

Dzierżawa prawdopodobnie ma zasady dostępu warunkowego, które wymagają uwierzytelniania wieloskładnikowego (MFA) dla wszystkich użytkowników, zgodnie z zaleceniami firmy Microsoft. Uwierzytelnianie wieloskładnikowe nie będzie działać z ropc, dlatego należy wykluczyć aplikacje testowe i przetestować użytkowników z tego wymagania.

Aby wykluczyć konta użytkowników:

  1. Zaloguj się do centrum administracyjnego firmy Microsoft Entra jako co najmniej Administracja istrator aplikacji w chmurze.
  2. Przejdź do usługi Identity>Security Center w okienku nawigacji po lewej stronie, a następnie wybierz pozycję Dostęp warunkowy.
  3. W obszarze Zasady wybierz zasady dostępu warunkowego, które wymagają uwierzytelniania wieloskładnikowego.
  4. Wybierz pozycję Użytkownicy lub tożsamości obciążeń.
  5. Zaznacz kartę Wyklucz , a następnie pole wyboru Użytkownicy i grupy .
  6. Wybierz konta użytkowników do wykluczenia w obszarze Wybierz wykluczonych użytkowników.
  7. Wybierz przycisk Wybierz, a następnie pozycję Zapisz.

Aby wykluczyć aplikację testową:

  1. W obszarze Zasady wybierz zasady dostępu warunkowego, które wymagają uwierzytelniania wieloskładnikowego.
  2. Wybierz pozycję Aplikacje w chmurze lub akcje.
  3. Wybierz kartę Wyklucz , a następnie wybierz wykluczone aplikacje w chmurze.
  4. Wybierz aplikacje, które chcesz wykluczyć w obszarze Wybierz wykluczone aplikacje w chmurze.
  5. Wybierz przycisk Wybierz, a następnie pozycję Zapisz.

Pisanie testów aplikacji

Po skonfigurowaniu możesz napisać testy automatyczne. Poniżej przedstawiono testy dla:

  1. Przykładowy kod platformy .NET używa biblioteki Microsoft Authentication Library (MSAL) i xUnit, typowej platformy testowania.
  2. Przykładowy kod JavaScript używa biblioteki Microsoft Authentication Library (MSAL) i playwright, typowej platformy testowania.

Konfigurowanie pliku appsettings.json

Dodaj identyfikator klienta utworzonej wcześniej aplikacji testowej, niezbędne zakresy i identyfikator URI magazynu kluczy do pliku appsettings.json projektu testowego.

{
  "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//"
  }
}

Konfigurowanie klienta do użycia we wszystkich klasach testowych

Użyj elementu SecretClient(), aby uzyskać testowe wpisy tajne nazwy użytkownika i hasła z usługi Azure Key Vault. Kod używa wykładniczego wycofywania dla ponownych prób w przypadku ograniczenia usługi Key Vault.

DefaultAzureCredential() uwierzytelnia się w usłudze Azure Key Vault, uzyskując token dostępu z jednostki usługi skonfigurowanej przez zmienne środowiskowe lub tożsamość zarządzaną (jeśli kod jest uruchomiony w zasobie platformy Azure z tożsamością zarządzaną). Jeśli kod jest uruchomiony lokalnie, DefaultAzureCredential używa poświadczeń użytkownika lokalnego. Przeczytaj więcej w zawartości biblioteki klienta tożsamości platformy Azure.

Użyj biblioteki Microsoft Authentication Library (MSAL), aby uwierzytelnić się przy użyciu przepływu ROPC i uzyskać token dostępu. Token dostępu jest przekazywany wraz z tokenem elementu nośnego w żądaniu HTTP.

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;
}

Używanie w klasach testowych

Poniższy przykład to test, który wywołuje program Microsoft Graph. Zastąp ten test dowolną wartością, którą chcesz przetestować we własnej aplikacji lub interfejsie API.

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);
    }
}