Automatizált integrációs tesztek futtatása

Fejlesztőként automatizált integrációs teszteket szeretne futtatni a fejlesztendő alkalmazásokon. Az API meghívása Microsoft Identitásplatform (vagy más védett API-k, például a Microsoft Graph) használatával automatizált integrációs tesztekben kihívást jelent. A Microsoft Entra ID gyakran interaktív felhasználói bejelentkezési kérést igényel, amelyet nehéz automatizálni. Ez a cikk azt ismerteti, hogyan használhatja az erőforrás-tulajdonosi jelszó hitelesítőadat-megadása (ROPC) nevű nem interaktív folyamatot a felhasználók automatikus tesztelésre való bejelentkezéséhez.

Az automatizált integrációs tesztek előkészítéséhez hozzon létre néhány tesztfelhasználót, hozzon létre és konfiguráljon egy alkalmazásregisztrációt, és esetleg módosítsa a bérlő konfigurációját. Ezen lépések némelyike rendszergazdai jogosultságokat igényel. A Microsoft azt is javasolja, hogy éles környezetben ne használja a ROPC-folyamatot. Hozzon létre egy külön tesztbérlelőt , amely ön a rendszergazda, így biztonságosan és hatékonyan futtathatja az automatizált integrációs teszteket.

Figyelmeztetés

A Microsoft azt javasolja, hogy éles környezetben ne használja a ROPC-folyamatot. A legtöbb éles forgatókönyvben biztonságosabb alternatívák érhetők el és ajánlottak. A ROPC-folyamat nagyon nagy megbízhatóságot igényel az alkalmazásban, és olyan kockázatokat hordoz, amelyek más hitelesítési folyamatokban nem jelennek meg. Ezt a folyamatot csak tesztelési célokra érdemes használni egy külön tesztbérlánnyal, és csak tesztfelhasználókkal.

Fontos

  • A Microsoft Identitásplatform csak a Microsoft Entra-bérlőken belüli ROPC-t támogatja, a személyes fiókokat nem. Ez azt jelenti, hogy bérlőspecifikus végpontot (https://login.microsoftonline.com/{TenantId_or_Name}) vagy végpontot kell használnia organizations .
  • A Microsoft Entra bérlőhöz meghívott személyes fiókok nem használhatják a ROPC-ot.
  • A jelszóval nem rendelkező fiókok nem tudnak bejelentkezni a ROPC-val, ami azt jelenti, hogy az olyan funkciók, mint az SMS-bejelentkezés, a FIDO és az Authenticator alkalmazás nem fognak működni ezzel a folyamattal.
  • If users need to use multi-factor authentication (MFA) to log in to the application, they will be blocked instead.
  • A ROPC nem támogatott a hibrid identitás-összevonási forgatókönyvekben (például a Microsoft Entra ID és a helyszíni fiókok hitelesítéséhez használt Active Directory összevonási szolgáltatások (AD FS) (AD FS). Ha a felhasználókat teljes oldalról átirányítják egy helyi azonosítószolgáltatóhoz, a Microsoft Entra ID nem tudja tesztelni a felhasználónevet és a jelszót az adott azonosítószolgáltatóval szemben. Pass-through authentication is supported with ROPC, however.
  • A hibrid identitás-összevonási forgatókönyv kivétele a következő: Az AllowCloudPasswordValidation értékre beállított Home Realm Discovery-szabályzat lehetővé teszi, hogy a ROPC-folyamat működjön az összevont felhasználók számára a helyszíni jelszó felhőbe való szinkronizálásakor. For more information, see Enable direct ROPC authentication of federated users for legacy applications .

Külön tesztbérlelési bérlő létrehozása

A ROPC hitelesítési folyamat használata kockázatos egy éles környezetben, ezért hozzon létre egy külön bérlőt az alkalmazások teszteléséhez. Használhat egy meglévő tesztbérlõt, de rendszergazdának kell lennie a bérlőben, mivel az alábbi lépések némelyike rendszergazdai jogosultságokat igényel.

Kulcstartó létrehozása és konfigurálása

Javasoljuk, hogy biztonságosan tárolja a teszt felhasználóneveket és jelszavakat titkos kulcsként az Azure Key Vaultban. Amikor később futtatja a teszteket, a tesztek egy biztonsági tag kontextusában futnak. A biztonsági tag egy Microsoft Entra-felhasználó, ha helyileg futtat teszteket (például a Visual Studióban vagy a Visual Studio Code-ban), vagy szolgáltatásnév vagy felügyelt identitás, ha teszteket futtat az Azure Pipelinesban vagy egy másik Azure-erőforrásban. A biztonsági tagnak olvasási és titkos kódok listájára vonatkozó engedélyekkel kell rendelkeznie, hogy a tesztfuttató le tudja szerezni a teszt felhasználóneveit és jelszavát a kulcstartóból. További információ: Hitelesítés az Azure Key Vaultban.

  1. Hozzon létre egy új kulcstartót , ha még nincs ilyenje.
  2. Jegyezze fel a Vault URI tulajdonságértékét (hasonló https://<your-unique-keyvault-name>.vault.azure.net/) a cikk későbbi részében, a példatesztben használt értékhez.
  3. Rendeljen hozzáférési szabályzatot a teszteket futtató biztonsági taghoz. Adjon a felhasználónak, a szolgáltatásnévnek vagy a felügyelt identitásnak titkos kulcsok beolvasására és listázására vonatkozó engedélyeket a kulcstartóban.

Tesztfelhasználók létrehozása

Tipp.

A cikkben szereplő lépések a portáltól függően kissé eltérhetnek.

Hozzon létre néhány tesztfelhasználót a bérlőben teszteléshez. Mivel a tesztfelhasználók nem tényleges emberek, javasoljuk, hogy rendeljen hozzá összetett jelszavakat, és biztonságosan tárolja ezeket a jelszavakat titkos kulcsként az Azure Key Vaultban.

  1. Jelentkezzen be a Microsoft Entra felügyeleti központba legalább felhőalkalmazásként Rendszergazda istratorként.
  2. Tallózással keresse meg az Identitásfelhasználók>>minden felhasználót.
  3. Válassza az Új felhasználó lehetőséget, és hozzon létre egy vagy több tesztfelhasználói fiókot a címtárban.
  4. A cikk későbbi részében szereplő példateszt egyetlen tesztfelhasználót használ. Adja hozzá a teszt felhasználónevet és jelszót titkos kulcsként a korábban létrehozott kulcstartóban. Adja hozzá a felhasználónevet egy "TestUserName" nevű titkos kódként, a jelszót pedig egy "TestPassword" nevű titkos kódként.

Alkalmazásregisztráció létrehozása és konfigurálása

Regisztráljon egy alkalmazást, amely ügyfélalkalmazásként működik, amikor API-kat hív meg a tesztelés során. Ez nem lehet ugyanaz az alkalmazás, mint az éles környezetben. Külön alkalmazással kell rendelkeznie, amelyet csak tesztelési célokra használhat.

Register an application

Alkalmazásregisztráció létrehozása. Kövesse az alkalmazásregisztráció rövid útmutatójában leírt lépéseket. Nem kell átirányítási URI-t vagy hitelesítő adatokat hozzáadnia, így kihagyhatja ezeket a szakaszokat.

Jegyezze fel az alkalmazás (ügyfél) azonosítóját, amelyet a cikk későbbi részében, a példatesztben használunk.

Az alkalmazás engedélyezése nyilvános ügyfélfolyamatokhoz

A ROPC egy nyilvános ügyfélfolyamat, ezért engedélyeznie kell az alkalmazást a nyilvános ügyfélfolyamatokhoz. A Microsoft Entra Felügyeleti központban található alkalmazásregisztrációból válassza a Hitelesítés>speciális beállításai a nyilvános ügyfélfolyamatok engedélyezése lehetőséget>. Állítsa a kapcsolót Igen értékre.

Mivel a ROPC nem interaktív folyamat, a rendszer nem fogja kérni a hozzájárulási képernyővel, hogy a futásidőben hozzájáruljon ezekhez. Előzetes hozzájárulás a jogkivonatok beszerzésekor felmerülő hibák elkerüléséhez szükséges engedélyekhez.

Adja hozzá az engedélyeket az alkalmazáshoz. Ne adjon hozzá bizalmas vagy magas jogosultsági szintű engedélyeket az alkalmazáshoz, javasoljuk, hogy a tesztelési forgatókönyveket a Microsoft Entra ID-val való integrációval kapcsolatos alapvető integrációs forgatókönyvekre terjedjen ki.

A Microsoft Entra Felügyeleti központban található alkalmazásregisztrációból lépjen az API-engedélyek>hozzáadása engedély hozzáadása elemre. Adja hozzá a használni kívánt API-k meghívásához szükséges engedélyeket. Az ebben a cikkben szereplő teszt például az engedélyeket és https://graph.microsoft.com/User.ReadBasic.All az https://graph.microsoft.com/User.Read engedélyeket használja.

Az engedélyek hozzáadása után hozzá kell adnia őket. Az engedélyekhez való hozzájárulás módja attól függ, hogy a tesztalkalmazás ugyanabban a bérlőben van-e, mint az alkalmazásregisztráció, és hogy Ön rendszergazda-e a bérlőben.

Az alkalmazás- és alkalmazásregisztráció ugyanabban a bérlőben található, és Ön rendszergazda

Ha ugyanabban a bérlőben szeretné tesztelni az alkalmazást, amelyben regisztrálta azt, és Ön a bérlő rendszergazdája, a Microsoft Entra felügyeleti központ engedélyeit is jóváhagyhatja. Az Alkalmazásregisztrációban az Azure Portalon lépjen az API-engedélyek elemre, és válassza a Rendszergazdai hozzájárulás <megadása your_tenant_name> gombot az Engedély hozzáadása gomb mellett, majd az Igen lehetőséget a megerősítéshez.

Az alkalmazás- és alkalmazásregisztráció különböző bérlőkben található, vagy Ön nem rendszergazda

Ha nem ugyanabban a bérlőben tervezi tesztelni az alkalmazást, amelyben regisztrálta, vagy ön nem rendszergazda a bérlőben, nem járulhat hozzá a Microsoft Entra felügyeleti központ engedélyeihez. Bizonyos engedélyekhez azonban továbbra is beleegyezhet, ha egy bejelentkezési kérést indít el egy webböngészőben.

A Microsoft Entra Felügyeleti központban található alkalmazásregisztrációban lépjen a Hitelesítési>platform konfigurációihoz>Platformweb hozzáadása>elemre. Adja hozzá az átirányítási URI-t "https://localhost" és válassza a Konfigurálás lehetőséget.

Nincs mód arra, hogy a nem rendszergazda felhasználók előzetes hozzájárulást adjanak az Azure Portalon keresztül, ezért küldje el a következő kérést egy böngészőben. Amikor a rendszer a bejelentkezési képernyővel kéri, jelentkezzen be egy előző lépésben létrehozott tesztfiókkal. Hozzájárulás a rendszer által kérendő engedélyekhez. Előfordulhat, hogy meg kell ismételnie ezt a lépést minden meghívni kívánt API-hoz, és tesztelni kell a használni kívánt felhasználókat.

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

Cserélje le a(z) {tenant} kifejezést a bérlőazonosítóra, {your_client_ID} az alkalmazás ügyfélazonosítójára, a {resource_you_want_to_call} pedig az URI azonosítóra (például "https://graph.microsoft.com") vagy annak az API-nak az alkalmazásazonosítója, amelyhez hozzá szeretne férni.

Tesztalkalmazások és felhasználók kizárása az MFA-szabályzatból

A bérlő valószínűleg rendelkezik egy feltételes hozzáférési szabályzattal, amely többtényezős hitelesítést (MFA) igényel az összes felhasználó számára, a Microsoft által javasolt módon. Az MFA nem fog működni a ROPC-val, ezért fel kell mentesítenie a tesztalkalmazásokat és a tesztelő felhasználókat ebből a követelményből.

Felhasználói fiókok kizárása:

  1. Jelentkezzen be a Microsoft Entra felügyeleti központba legalább felhőalkalmazásként Rendszergazda istratorként.
  2. Keresse meg az Identity>Security Centert a bal oldali navigációs panelen, majd válassza a Feltételes hozzáférés lehetőséget.
  3. A Szabályzatokban válassza ki az MFA-t igénylő feltételes hozzáférési szabályzatot.
  4. Válassza ki a Felhasználók vagy számítási feladatok identitását.
  5. Jelölje be a Kizárás lapot, majd a Felhasználók és csoportok jelölőnégyzetet.
  6. Válassza ki azt a felhasználói fiókot, amelyet ki szeretne zárni a Kizárt felhasználók kijelölése területen.
  7. Kattintson a Kijelölés gombra, majd a Mentés gombra.

Tesztalkalmazás kizárása:

  1. A Szabályzatokban válassza ki az MFA-t igénylő feltételes hozzáférési szabályzatot.
  2. Válassza a Felhőalkalmazások vagy műveletek lehetőséget.
  3. Válassza a Kizárás lapot, majd válassza ki a kizárt felhőalkalmazásokat.
  4. Válassza ki a kizárni kívánt alkalmazás(oka)t a Kizárt felhőalkalmazások kiválasztása területen.
  5. Kattintson a Kijelölés gombra, majd a Mentés gombra.

Alkalmazástesztek írása

Most, hogy be van állítva, megírhatja az automatizált teszteket. A következőkre vonatkozó tesztek:

  1. A .NET-példakód a Microsoft Authentication Libraryt (MSAL) és az xUnitot, egy közös tesztelési keretrendszert használja.
  2. A JavaScript-példakód a Microsoft Authentication Library (MSAL) és a Playwright, egy közös tesztelési keretrendszert használ.

Az appsettings.json fájl beállítása

Adja hozzá a korábban létrehozott tesztalkalmazás ügyfél-azonosítóját, a szükséges hatóköröket és a key vault URI-t a tesztprojekt appsettings.json fájljához.

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

Az ügyfél beállítása az összes tesztosztályhoz való használatra

A SecretClient() használatával lekérheti a teszt felhasználónevet és a jelszó titkos kulcsát az Azure Key Vaultból. A kód exponenciális visszalépést használ az újrapróbálkozáshoz, ha a Key Vault szabályozása folyamatban van.

A DefaultAzureCredential() az Azure Key Vaulttal hitelesít egy hozzáférési jogkivonatot a környezeti változók vagy felügyelt identitások által konfigurált szolgáltatásnévtől (ha a kód felügyelt identitással rendelkező Azure-erőforráson fut). Ha a kód helyileg fut, DefaultAzureCredential a helyi felhasználó hitelesítő adatait használja. További információ az Azure Identity ügyfélkódtár tartalmában.

A Microsoft Authentication Library (MSAL) használatával hitelesítheti a ROPC-folyamatot, és hozzáférési jogkivonatot kérhet le. A hozzáférési jogkivonat tulajdonosi jogkivonatként lesz átadva a HTTP-kérelemben.

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

Használat a tesztosztályokban

Az alábbi példa egy Microsoft Graphot hívó teszt. Cserélje le ezt a tesztet arra, amit a saját alkalmazásán vagy API-ján tesztelni szeretne.

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