Udostępnij za pośrednictwem


Uruchamianie testów automatycznej integracji

Jako deweloper chcesz uruchamiać zautomatyzowane testy integracji w opracowywanych aplikacjach. Wywoływanie interfejsu API chronionego przez platformę tożsamości firmy Microsoft (lub inne chronione interfejsy API, takie jak Microsoft Graph) w zautomatyzowanych 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. 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. Użyj bardziej zaufanej metody, takiej jak przepływ kodu autoryzacji. 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 są obecne w innych przepływach uwierzytelniania. Ten przepływ należy używać wyłącznie do celów testowych w oddzielnej dzierżawie testowej i wyłącznie z użytkownikami testowymi.

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.
  • Jeśli użytkownicy muszą używać uwierzytelniania wieloskładnikowego (MFA), aby zalogować się do aplikacji, są one blokowane.
  • 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ą przekierowani na pełną stronę do lokalnego dostawcy tożsamości, identyfikator Entra firmy Microsoft nie może przetestować nazwy użytkownika i hasła względem tego dostawcy tożsamości. Uwierzytelnianie przekazywane jest jednak obsługiwane w przypadku uwierzytelniania ROPC.
  • Wyjątek od scenariusza federacji tożsamości hybrydowej będzie następujący: zasady odnajdywania obszaru macierzystego z ustawieniem AllowCloudPasswordValidation na TRUE umożliwią przepływ ROPC dla użytkowników z federacją, gdy hasło lokalne zostanie zsynchronizowane z chmurą. Aby uzyskać więcej informacji, zobacz Włączanie bezpośredniego uwierzytelniania ROPC użytkowników federacyjnych dla 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 do Odczytu i Wyświetlania sekretów, 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 nie masz żadnego.
  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

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 co najmniej jako administrator aplikacji w chmurze.
  2. Przejdź do Entra ID>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 sekrety 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órą być może masz 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ącym rejestracji aplikacji i zanotować 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 Microsoft Entra admin center, przejdź do Uwierzytelnianie>Ustawienia zaawansowane>Zezwalaj na przepływy klientów publicznych. Ustaw przełącznik na Tak.

Ponieważ ROPC nie jest przepływem interaktywnym, nie zostanie wyświetlony monit z ekranem zgody podczas wykonywania. Wyrażenie zgody na uprawnienia z wyprzedzeniem w celu uniknięcia 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 APIDodaj uprawnienie. Dodaj uprawnienia potrzebne do wywoływania używanych interfejsów API. 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.

Przejdź do centrum administracyjnego firmy Microsoft Entra, przejdź do pozycjiRejestracje> aplikacji Entra ID> Wybierz swoją aplikację z listy. >Przejdź do Uwierzytelnianie>Konfiguracje platformy>Dodaj platformę>Web. Dodaj identyfikator URI przekierowania "https://localhost"" i wybierz pozycję Konfiguruj.

Nie ma możliwości, aby użytkownicy niebędący administratorami mogli wyrazić zgodę z wyprzedzeniem za pośrednictwem portalu Azure, więc wyślij następujące żądanie przez przeglądarkę. 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żawcy, {your_client_ID}, identyfikatorem klienta aplikacji i {resource_you_want_to_call} URI identyfikatora (np. "https://graph.microsoft.com"") lub identyfikatorem aplikacji interfejsu API, do którego próbujesz uzyskać dostęp.

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

Klient prawdopodobnie ma politykę dostępu warunkowego, która wymaga 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 użytkowników testowych z tego wymagania.

Aby wykluczyć konta użytkowników:

  1. Zaloguj się do centrum administracyjnego firmy Microsoft Entra co najmniej jako administrator aplikacji w chmurze.
  2. Przejdź do Entra ID>Warunkowy dostęp>Zasady.
  3. Wybierz zasady dostępu warunkowego, które wymagają uwierzytelniania wieloskładnikowego.
  4. Wybierz element Użytkownicy lub tożsamości związane z obciążeniami.
  5. Zaznacz kartę Wyklucz , a następnie pole wyboru Użytkownicy i grupy .
  6. Wybierz konto użytkownika 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 lub akcje w chmurze.
  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 ID klienta wcześniej utworzonej aplikacji testowej, dodaj 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 SecretClient(), aby uzyskać testowe tajemnice nazwy użytkownika i hasła z 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);
    }
}