Blazor : API + custom domain name = 401 ?

Nous allons parler de la mise en production d'une application Blazor Asp.Net Hosted (donc une application client  WASM + une application serveur ASP.NET) sur Azure.

L'application web Blazor se connecte à une API hostée elle aussi sur Azure (via un Private Network, on en reparlera danbs un billet ultérieur).

Par défaut, à la mise en production, l'App Service a une URL du type :

https://monsite.azurewebsites.net

Elle se connecte à l'API accessible via :

https://monsite-api.azurewebsites.net

 Tout va bien, une fois publiée, l'application se comporte normalement et accède bien à l'API.

Tout va bien.

Jusqu'à ce que... Il nous prenne l'envie d'associer un nom de domaine à l'application.

https://monnomdedomaine.xyz

Et là... C'est l'accident. L'application Blazor web qui tournait parfaitement dans un navigateur ne fonctionne plus : une litanie d'erreurs 401.3 dans l'inspecteur.

Impossible d'accéder à l'API à partir du web.

En fait, tout simplement, l'accès à l'API est refusé car le nom de domaine appelant n'est plus le même que le nom en 

https://monsite.azurewebsites.net/

La solution ?  

Il faut définir la variable IssuerUri dans Program.cs (du projet Server) en spécifiant le nouveau nom de domaine.

builder.Services.AddIdentityServer(options =>
{
    var issuerUri = builder.Configuration.GetValue<string?>("IssuerUri");
    if (issuerUri != null)
        options.IssuerUri = issuerUri;
})
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(); 

Ici, l'url spécifée par IssuerUri a été mise dans le fichier appsettings.json - on pourrait écrire directement :

builder.Services.AddIdentityServer(options =>
{
    options.IssuerUri = "https://monsite.azurewebsites.net";
})
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(); 

mais il y a un bémol : le IssuerUri ne fonctionne pas en Debug !!! Uniquement en production.

Nous avons donc laissé la clé vide / null dans le appsettings.Development.json et mis la bonne url - "https://monsite.azurewebsites.net" dans le appsettings.json.

Avec ça, vous ne devriez plus avoir de 401 en production.