Testare le impostazioni CORS di un'applicazione ASP.NET Core

di Marco De Sanctis, in ASP.NET Core,

Come sappiamo, per configurare CORS su un'applicazione ASP.NET Core basta impostare i parametri che desideriamo nel metodo UseCors, all'interno della classe di Startup:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // .. altro codice qui ..
    var allowedOrigins = new[]
    {
      "https://mywebsite.com",
      "https://admin.mywebsite.com",
      "https://localhost:44353"
    };

    builder.UseCors(policy => 
    {
        policy
            .WithOrigins(allowedOrigins)
            .AllowAnyMethod()
            .AllowAnyHeader()
            .WithExposedHeaders("Operation-Location");
    });

    // ... altro codice qui ...
}

Ma come possiamo scrivere degli unit test che verifichino, magari in maniera automatizzata nelle nostre build pipeline, che le impostazioni siano quelle che vogliamo?

Il modo più efficace è sicuramente quello di sfruttare WebApplicationFactory, in un test simile al seguente:

[Fact]
[InlineData("https://mywebsite.com")]
[InlineData("https://admin.mywebsite.com")]
[InlineData("https://localhost:44353")]
public async Task UseCors_Configures_CorrectDomains(string url)
{
    // Startup è la medesima classe di Startup dell'applicazione ASP.NET Core
    var factory = new WebApplicationFactory<Startup>();

    // creiamo un "finto" HttpClient per effettuare la richiesta
    var client = factory.CreateClient();

    var request = new HttpRequestMessage(HttpMethod.Options, "/");
    request.Headers.Add("Access-Control-Request-Headers", "authorization,content-type");
    request.Headers.Add("Access-Control-Request-Method", "GET");
    request.Headers.Add("Origin", url); 

    var response = await client.SendAsync(request);

    response.EnsureSuccessStatusCode();
    response.Headers.TryGetValues("Access-Control-Allow-Origin", out var allowedOrigins);

     Assert.Contains(url, allowedOrigins);
}

Tramite WebApplicationFactory, infatti, il test in alto avvia in locale il runtime di ASP.NET Core e genera un HttpClient fittizio tramite cui effettuarvi delle richieste.

A questo punto, non dobbiamo far altro che simulare la chiamata del browser, generando una richiesta di prefile in OPTIONS, e specificando gli header per il dominio di origine e il verbo HTTP.

Una volta effettuata questa invocazione, non dobbiamo far altro che verificare che la risposta del server contenga l'header Access-Control-Allow-Origin con lo stesso valore che abbiamo specificato come origin.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi