Spouštění automatizovaných integračních testů

Jako vývojář chcete spouštět automatizované integrační testy pro aplikace, které vyvíjíte. Volání rozhraní API chráněného platformou Microsoft Identity Platform (nebo jinými chráněnými rozhraními API, jako je Microsoft Graph), je výzvou. Microsoft Entra ID často vyžaduje interaktivní výzvu k přihlášení uživatele, což je obtížné automatizovat. Tento článek popisuje, jak můžete použít neinteraktivní tok s názvem Udělení přihlašovacích údajů vlastníka hesla vlastníka prostředku (ROPC) k automatickému přihlášení uživatelů k testování.

Pokud se chcete připravit na automatizované integrační testy, vytvořte některé testovací uživatele, vytvořte a nakonfigurujte registraci aplikace a případně proveďte změny konfigurace vašeho tenanta. Některé z těchto kroků vyžadují oprávnění správce. Společnost Microsoft také doporučuje nepoužívat tok ROPC v produkčním prostředí. Vytvořte samostatného testovacího tenanta , kterého jste správcem, abyste mohli bezpečně a efektivně spouštět automatizované integrační testy.

Upozorňující

Společnost Microsoft doporučuje nepoužívat tok ROPC v produkčním prostředí. Ve většině produkčních scénářů jsou k dispozici a doporučeny bezpečnější alternativy. Tok ROPC vyžaduje velmi vysoký stupeň důvěryhodnosti v aplikaci a nese rizika, která nejsou přítomna v jiných tocích ověřování. Tento tok byste měli použít jenom pro účely testování v samostatném testovacím tenantovi a pouze s testovacími uživateli.

Důležité

  • Platforma Microsoft Identity Platform podporuje pouze ROPC v rámci tenantů Microsoft Entra, nikoli osobních účtů. To znamená, že musíte použít koncový bod specifický pro tenanta (https://login.microsoftonline.com/{TenantId_or_Name}) nebo organizations koncový bod.
  • Osobní účty pozvané do tenanta Microsoft Entra nemohou používat ROPC.
  • Účty, které nemají hesla, se nemůžou přihlásit pomocí ROPC, což znamená, že s tímto tokem nebudou fungovat funkce, jako je přihlášení přes SMS, FIDO a aplikace Authenticator.
  • Pokud uživatelé potřebují k přihlášení do aplikace použít vícefaktorové ověřování (MFA), budou místo toho zablokováni.
  • ROPC se nepodporuje ve scénářích federace hybridních identit (například ID Microsoft Entra a Active Directory Federation Services (AD FS) (AD FS) používané k ověřování místních účtů). Pokud jsou uživatelé kompletně přesměrováni na místního poskytovatele identit, služba Microsoft Entra ID není schopna u tohoto poskytovatele identit otestovat uživatelské jméno a heslo. Předávací ověřování se ale u ROPC podporuje.
  • Výjimkou scénáře federace hybridní identity je následující: Zásady zjišťování domovské sféry s povolenou možností AllowCloudPasswordValidation nastavenou na HODNOTU TRUE umožní toku ROPC fungovat pro federované uživatele, když se místní heslo synchronizuje do cloudu. Další informace najdete v tématu Povolení přímého ověřování ROPC federovaných uživatelů pro starší verze aplikací.

Vytvoření samostatného testovacího tenanta

Použití toku ověřování ROPC je rizikové v produkčním prostředí, takže vytvořte samostatného tenanta pro testování aplikací. Můžete použít existujícího testovacího tenanta, ale musíte být správcem v tenantovi, protože některé z následujících kroků vyžadují oprávnění správce.

Vytvoření a konfigurace trezoru klíčů

Doporučujeme bezpečně uložit testovací uživatelská jména a hesla jako tajné kódy ve službě Azure Key Vault. Když testy spustíte později, testy se spustí v kontextu objektu zabezpečení. Objekt zabezpečení je uživatel Microsoft Entra, pokud spouštíte testy místně (například v sadě Visual Studio nebo Visual Studio Code), nebo instanční objekt nebo spravovaná identita, pokud spouštíte testy v Azure Pipelines nebo jiném prostředku Azure. Objekt zabezpečení musí mít oprávnění ke čtení a výpisu tajných kódů, aby spouštěč testů mohl získat testovací uživatelská jména a hesla z trezoru klíčů. Další informace najdete v tématu Ověřování ve službě Azure Key Vault.

  1. Pokud ho ještě nemáte, vytvořte nový trezor klíčů.
  2. Poznamenejte si hodnotu vlastnosti URI trezoru (podobná https://<your-unique-keyvault-name>.vault.azure.net/hodnotě), která se používá v ukázkovém testu dále v tomto článku.
  3. Přiřaďte zásadu přístupu pro objekt zabezpečení, který spouští testy. Udělte uživateli, instančnímu objektu nebo spravované identitě oprávnění Získat a vypsat tajné kódy v trezoru klíčů.

Vytvoření testovacích uživatelů

Tip

Postup v tomto článku se může mírně lišit v závislosti na portálu, od který začínáte.

Vytvořte v tenantovi několik testovacích uživatelů pro testování. Vzhledem k tomu, že testovací uživatelé nejsou skutečnými lidmi, doporučujeme přiřazovat složitá hesla a bezpečně je ukládat jako tajné kódy ve službě Azure Key Vault.

  1. Přihlaste se do Centra pro správu Microsoft Entra jako alespoň cloudová aplikace Správa istrator.
  2. Přejděte k identitě>Uživatelé>Všichni uživatelé.
  3. Vyberte Nový uživatel a vytvořte v adresáři jeden nebo více testovacích uživatelských účtů.
  4. Ukázkový test dále v tomto článku používá jednoho testovacího uživatele. Do trezoru klíčů, který jste vytvořili dříve, přidejte testovací uživatelské jméno a heslo jako tajné kódy. Přidejte uživatelské jméno jako tajný kód s názvem TestUserName a heslo jako tajný kód s názvem TestPassword.

Vytvoření a konfigurace registrace aplikace

Zaregistrujte aplikaci, která funguje jako klientská aplikace při volání rozhraní API během testování. To by neměla být stejná aplikace, kterou už máte v produkčním prostředí. Pro účely testování byste měli mít samostatnou aplikaci.

Registrace aplikace

Vytvořte registraci aplikace. Můžete postupovat podle kroků v rychlém startu registrace aplikace. Nemusíte přidávat identifikátor URI přesměrování ani přidávat přihlašovací údaje, takže tyto oddíly můžete přeskočit.

Poznamenejte si ID aplikace (klienta), které se používá v ukázkovém testu dále v tomto článku.

Povolení aplikace pro toky veřejných klientů

ROPC je veřejný tok klienta, takže musíte aplikaci povolit pro toky veřejných klientů. V registraci aplikace v Centru pro správu Microsoft Entra přejděte do části Upřesnit nastavení>ověřování>Povolit toky veřejných klientů. Nastavte přepínač na Ano.

Vzhledem k tomu, že ROPC není interaktivní tok, nezobrazí se výzva k vyjádření souhlasu s obrazovkou souhlasu s těmito informacemi za běhu. Předběžné vyjádření souhlasu s oprávněními, abyste se vyhnuli chybám při získávání tokenů.

Přidejte oprávnění k aplikaci. Nepřidávejte do aplikace žádná citlivá nebo vysoce privilegovaná oprávnění, doporučujeme nastavit rozsah testovacích scénářů na základní scénáře integrace související s integrací s Microsoft Entra ID.

V registraci aplikace v Centru pro správu Microsoft Entra přejděte do části Oprávnění>rozhraní API Přidat oprávnění. Přidejte oprávnění, která potřebujete k volání rozhraní API, která budete používat. Testovací příklad dále v tomto článku používá oprávnění https://graph.microsoft.com/User.Read a https://graph.microsoft.com/User.ReadBasic.All oprávnění.

Po přidání oprávnění budete muset souhlasit. Způsob, jakým souhlasíte s oprávněními, závisí na tom, jestli je vaše testovací aplikace ve stejném tenantovi jako registrace aplikace a jestli jste správcem v tenantovi.

Registrace aplikací a aplikací je ve stejném tenantovi a vy jste správce

Pokud plánujete otestovat aplikaci ve stejném tenantovi, ve stejném tenantovi, ve které jste ho zaregistrovali, a jste správcem v daném tenantovi, můžete souhlasit s oprávněními z Centra pro správu Microsoft Entra. V registraci aplikace na webu Azure Portal přejděte do části Oprávnění rozhraní API a vyberte tlačítko Udělit souhlas správce pro <your_tenant_name> vedle tlačítka Přidat oprávnění a pak potvrďte ano .

Registrace aplikací a aplikací se nachází v různých tenantech nebo nejste správcem.

Pokud neplánujete otestovat aplikaci ve stejném tenantovi, ve které jste ji zaregistrovali, nebo nejste správcem ve vašem tenantovi, nemůžete udělit souhlas s oprávněními z Centra pro správu Microsoft Entra. Přesto můžete udělit souhlas s některými oprávněními tím, že ve webovém prohlížeči aktivujete výzvu k přihlášení.

V registraci aplikace v Centru pro správu Microsoft Entra přejděte na Konfigurace>ověřovací>platformy Přidat web platformy.> Přidejte identifikátor URI přesměrování;https://localhost" a vyberte Konfigurovat.

Neexistuje způsob, jak uživatelé bez oprávnění správce předem odsouhlasit prostřednictvím webu Azure Portal, takže v prohlížeči odešlete následující žádost. Po zobrazení výzvy na přihlašovací obrazovce se přihlaste pomocí testovacího účtu, který jste vytvořili v předchozím kroku. Udělte souhlas s oprávněními, se kterými se zobrazí výzva. Tento krok možná budete muset zopakovat pro každé rozhraní API, které chcete volat a testovat uživatele, kterého chcete použít.

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

Nahraďte {tenant} svým ID tenanta, {your_client_ID} ID klienta vaší aplikace a {resource_you_want_to_call} identifikátorem URI (například "https://graph.microsoft.com") nebo ID aplikace rozhraní API, ke které se pokoušíte získat přístup.

Vyloučení testovacích aplikací a uživatelů ze zásad vícefaktorového ověřování

Váš tenant má pravděpodobně zásady podmíněného přístupu, které vyžadují vícefaktorové ověřování (MFA) pro všechny uživatele, jak doporučuje Microsoft. Vícefaktorové ověřování nebude fungovat s ROPC, takže z tohoto požadavku budete muset vyloučit testovací aplikace a otestovat uživatele.

Vyloučení uživatelských účtů:

  1. Přihlaste se do Centra pro správu Microsoft Entra jako alespoň cloudová aplikace Správa istrator.
  2. V levém navigačním podokně přejděte do služby Identity>Security Center a vyberte Podmíněný přístup.
  3. V části Zásady vyberte zásady podmíněného přístupu, které vyžadují vícefaktorové ověřování.
  4. Vyberte Uživatele nebo identity úloh.
  5. Vyberte kartu Vyloučit a zaškrtněte políčko Uživatelé a skupiny.
  6. Vyberte uživatelské účty, které chcete vyloučit v části Vybrat vyloučené uživatele.
  7. Vyberte tlačítko Vybrat a pak uložte.

Vyloučení testovací aplikace:

  1. V části Zásady vyberte zásady podmíněného přístupu, které vyžadují vícefaktorové ověřování.
  2. Vyberte Cloudové aplikace nebo akce.
  3. Vyberte kartu Vyloučit a pak vyberte vyloučené cloudové aplikace.
  4. Vyberte aplikace, které chcete vyloučit v části Vybrat vyloučené cloudové aplikace.
  5. Vyberte tlačítko Vybrat a pak uložte.

Psaní testů aplikací

Teď, když jste nastavili, můžete napsat automatizované testy. Následují testy pro:

  1. Ukázkový kód .NET používá knihovnu Microsoft Authentication Library (MSAL) a xUnit, běžnou testovací architekturu.
  2. Ukázkový kód Jazyka JavaScript používá knihovnu Microsoft Authentication Library (MSAL) a playwright, běžnou testovací architekturu.

Nastavení souboru appsettings.json

Přidejte ID klienta testovací aplikace, kterou jste vytvořili dříve, potřebné obory a identifikátor URI trezoru klíčů do souboru appsettings.json testovacího projektu.

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

Nastavení klienta pro použití ve všech testových třídách

K získání tajných kódů uživatelského jména a hesla ze služby Azure Key Vault použijte SecretClient( ). Kód používá exponenciální zpětný odsazení pro opakování v případě, že je služba Key Vault omezena.

DefaultAzureCredential() se ověřuje ve službě Azure Key Vault získáním přístupového tokenu z instančního objektu nakonfigurovaného proměnnými prostředí nebo spravovanou identitou (pokud kód běží na prostředku Azure se spravovanou identitou). Pokud je kód spuštěný místně, DefaultAzureCredential použije přihlašovací údaje místního uživatele. Další informace najdete v obsahu klientské knihovny Azure Identity.

K ověření pomocí toku ROPC a získání přístupového tokenu použijte knihovnu MSAL (Microsoft Authentication Library). Přístupový token se předává jako nosný token v požadavku 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;
}

Použití v testovacích třídách

Následující příklad je test, který volá Microsoft Graph. Nahraďte tento test jakýmkoliv způsobem, který chcete otestovat na vlastní aplikaci nebo rozhraní 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);
    }
}