Déployer vers Azure App Service
Un portail Power Portals Pro est une application Core à ASP.NET unique, quelle que soit la pile choisie, donc son déploiement est un standard dotnet publish pour un service d’application ordinaire. Cette page couvre les ressources à créer, les paramètres que le portail lit à l’écran, ce que nous suggérons comme valeurs par défaut, ainsi que les quelques étapes spécifiques à Power Portals Pro plutôt qu’à ASP.NET Core.
Ce que vous déployez
Les deux modèles produisent une application web et une sortie de publication. Il n’y a pas d’hôte front-end séparé à installer, pas de ressource statique du site, et pas de second service d’application :
- Blazor — le projet serveur héberge l’application. Sous
ServerouAutointeractivité, elle sert également le circuit Blazor SignalR ; sousWebAssemblyelle sert le package client et les/api/*points d’accès que le client appelle. - React —
dotnet publishexécute la compilation Vite du projet client et ladist/met en place dans celle dewwwrootl’hôte, donc un ASP.NET hôte Core sert le SPA et l’API depuis une seule origine. Rien de plus à câbler.
Note
Parce que les versions de publication de React sont déployées vers npm, Node doit être installé sur la machine qui tourne
dotnet publish— votre ordinateur portable ou l’agent de compilation. Le client du modèle demande Node^20.19.0 || >=22.12.0. App Service lui-même n’a jamais besoin de Node ; il ne voit que la sortie intégrée.
Paramètres par défaut suggérés
Des points de départ, pas des règles — mais ce sont ce que nous choisirions pour un nouveau portail de production.
- Système d’exploitation : Linux. Moins cher par niveau, plus rapide à démarrer, et cela maintient IIS complètement
web.confighors de l’équation. Windows fonctionne bien si votre organisation le standardise. - Pile d’exécution : .NET 10. Les modèles ciblent
net10.0. Publier en fonction du framework et laisser App Service fournir l’exécution. - Plan : B3 — pour chaque environnement, production incluse. B3 est le sommet de Basic : Always On, quatre cœurs et 7 Go, donc un portail commence avec la marge de manœuvre plutôt que de respecter ses limites sous sa première vraie charge. Changer de niveau plus tard est une commande sans redéployement ni temps d’arrêt significatif — jusqu’à B1 pour un environnement de développement ou de test qui n’a jamais besoin de la pièce. Ce que Basic ne vous offre pas : des emplacements de déploiement et une échelle automatique (les deux commencent à Standard — et comparez S1 à P0v3, qui est généralement moins cher sur Linux et a plus de mémoire).
- Toujours activé : activé. App Service décharge une application inactive, et un démarrage à froid signifie se reconnecter à Dataverse et reconstruire les caches de métadonnées et de localisation. Le premier visiteur après un moment de calme paie tout cela.
- HTTPS uniquement : activé, TLS 1.2 minimum, HTTP/2 activé. Le portail émet des cookies d’authentification ; il n’y a aucune raison d’accepter l’HTTP simple.
- Sockets web : activés pour Blazor Server ou Auto. Désactivé est la valeur par défaut du service d’application, et sans cela, le circuit retombe discrètement dans un long polling.
- Affinité de session : activée pour Blazor Server ou Auto — un circuit appartient à une seule instance. Désactivez-le pour les portails React et Blazor WebAssembly : ils sont sans état sur HTTP, et l’affinité ne déséquilibre que vos instances.
- Secrets dans Key Vault, référencés depuis les paramètres de l’application. Donnez une identité gérée au service d’application et pointez le paramètre vers le vault, afin que le secret ne reste jamais dans la configuration ou dans un script de déploiement.
- Les clés de protection des données dans Blob Storage dès que vous utilisez des emplacements de déploiement ou que vous dépassez une instance. Le porte-clés par défaut est par emplacement, et un échange désigne tout le monde.
WEBSITE_RUN_FROM_PACKAGE=1: optionnel, et ça en vaut la peine. Les déploiements deviennent atomiques et le répertoire de contenu en lecture seule. Le portail ne lit que depuis sa racine de contenu, donc rien ne casse — il met un tampon dans le dossier temporaire système, qui reste écrivable.- Analyses d’application : sur. Le framework enregistre les rejets de licences et les échecs Dataverse via
ILogger. Sans pubbli, vous lisez le flux de journal à la main exactement au moment où vous préféreriez ne pas l’être.
1. Créer le service d’application
Trois commandes. Substituez vos propres noms — myportal est utilisée tout au long de cette page.
az group create --name myportal-rg --location eastus
az appservice plan create --name myportal-plan --resource-group myportal-rg --sku B3 --is-linux
az webapp create --name myportal --resource-group myportal-rg --plan myportal-plan --runtime "DOTNETCORE:10.0"
Le nom de l’application web devient https://myportal.azurewebsites.net et doit être globalement unique. Choisissez-le délibérément : à moins de mettre un domaine personnalisé devant, c’est l’URL à laquelle votre clé de licence est liée.
2. Définir les options de plateforme
Ce sont ceux dont les défauts sont mauvais pour un portail.
az webapp config set --name myportal --resource-group myportal-rg --always-on true --min-tls-version 1.2 --http20-enabled true --web-sockets-enabled true
az webapp update --name myportal --resource-group myportal-rg --https-only true --client-affinity-enabled true
--web-sockets-enabled true— nécessaire pour Blazor Server et Auto. Inoffensif sur les portails React et WebAssembly, qui n’ouvrent jamais de circuit.--client-affinity-enabled— laisser pourtrueBlazor Server et Auto ; passerfalsepour React et Blazor WebAssembly afin que les requêtes soient réparties uniformément entre les instances.--always-on true— Niveau de base ou plus. Il n’est pas disponible sur les forfaits gratuits ou partagés.
3. Configuration
Les paramètres de l’application du service d’applications arrivent sous forme de variables d’environnement et supplantent appsettings.json, ce qui est exactement ce que vous voulez : laissez le fichier tel quel et définissez ici les valeurs par environnement.
Important
Les secrets utilisateur ne voyagent pas. Tout ce que vous stockiez
dotnet user-secretspendant le développement reste uniquement sur votre machine. Chacune de ces clés doit être recréée sous forme de paramètre d’application — ou de référence Key Vault — sinon l’application déployée ne démarrera pas.
Utilisez un double soulignement pour le séparateur de section : D365:ClientId devient D365__ClientId. Le formulaire deux-points fonctionne sur Windows App Service mais pas sous Linux, donc __ le formulaire à utiliser partout est le cas.
Toujours obligatoire
D365__Url— l’URL de l’environnement Dataverse, parhttps://yourorg.crm.dynamics.comexemple . Ce n’est pas un secret.D365__ClientId— l’identifiant client de l’enregistrement de l’application Entra que le portail connecte à Dataverse sous le nom. Ce n’est pas un secret.D365__ClientSecret— ce secret d’enregistrement est client. Secret : utilise une référence Key Vault.D365__EmailSenderEmailAddress— l’adresse de départ que le portail envoie via Dataverse. La plus facile à oublier, car elle n’est pas disponibleappsettings.jsonet l’application ne démarre pas sans elle.ASPNETCORE_ENVIRONMENT— le définir àProduction. Cela fait plus que modifier la page d’erreur : sur un portail React, le plan de secours SPA n’est enregistré qu’en dehors de Développement, donc un site laissé surDevelopmentredirige vers des liens profonds vershttp://localhost:5173au lieu de servir l’application.
Obligatoire si vous avez activé ce fournisseur de connexion
Authentication__Microsoft__ClientIdetAuthentication__Microsoft__ClientSecret— l’enregistrement de connexion, qui est une inscription d’application différente de celle de Dataverse. Voir Entrée ID Connexion (Connexion Entra).Authentication__Google__ClientIdetAuthentication__Google__ClientSecret.Authentication__Facebook__AppIdetAuthentication__Facebook__AppSecret.
Optionnel
Azure__Translation__Key,DeepL__Translation__KeyouGoogle__Translation__Key— quel que soit le fournisseur de traduction automatique que vous avez enregistré. Laissez-le non configuré et la page d’administration de la localisation cache simplement son panneau de traduction ; le reste de la page fonctionne toujours.Security__SystemAdminRoleName— le rôle de sécurité Dataverse qui accorde l’accès aux administrateurs de portail. Il est livréappsettings.json; il est remplacé ici lorsque le nom du rôle diffère selon l’environnement.
az webapp config appsettings set --name myportal --resource-group myportal-rg --settings ASPNETCORE_ENVIRONMENT=Production D365__Url="https://yourorg.crm.dynamics.com" D365__ClientId="00000000-0000-0000-0000-000000000000" D365__EmailSenderEmailAddress="portal@contoso.com"
Note
Les clés requises sont lues avec
GetRequiredValue, donc une clé manquante est lancée au démarrage plutôt que de casser plus tard lors du premier appel Dataverse. Sur un service d’applications, cela apparaît comme un site qui n’apparaît jamais — lisez le flux de journal, et l’exception nomme la clé.
4. Donner au portail une adresse à partir de laquelle envoyer
D365__EmailSenderEmailAddress c’est d’où provient l’email de confirmation de compte et de réinitialisation de mot de passe, et le framework le résout en cherchant un utilisateur Dataverse avec cette adresse, puis une file d’attente, puis une équipe. Utilisez une file d’attente. Son adresse nécessite une boîte aux lettres partagée dans Exchange Online, qui ne prend aucune licence, et tout le reste se passe dans Dataverse. Pointer le paramètre vers une personne réelle vous coûte plutôt trois choses :
- Leur nom apparaît sur chaque message automatisé. Les destinataires voient un collègue comme l’expéditeur d’une réinitialisation de mot de passe qu’ils n’ont pas envoyée.
- Les réponses arrivent dans leur boîte de réception. Les gens répondent aux messages sans réponse, et ces réponses vont là où personne ne les surveille.
- Le portail se brise quand ils partent. Désactiver le compte emporte l’expéditeur, et la défaillance apparaît alors que la confirmation du compte ne fonctionne pas discrètement.
Quatre étapes : une dans Exchange, puis trois dans Dataverse. Le serveur MCP effectue les trois étapes Dataverse en un seul appel avec create_email_queue, et check_email_sender indique quelle étape manque lorsque le courrier n’arrive pas :
- Créez une boîte aux lettres partagée avec l’adresse, dans le centre d’administration Exchange (Destinataires → Boîte aux lettres → Ajouter une boîte aux lettres partagée). Elle ne nécessite pas de licence. C’est ce que la synchronisation côté serveur envoie, donc sans elle, la dernière étape échoue avec une erreur concernant la validation de la configuration de la boîte aux lettres dans le serveur distant.
- Créez une file d’attente privée avec l’adresse (par
noreply@contoso.comexemple ), la livraison entrante None et la synchronisation côté serveur de la livraison sortante. Le nom de la file d’attente correspond à ce que les destinataires perçoivent comme l’expéditeur, donc nomme-le pour le portail plutôt que pour une personne. - Approuvez l’adresse. Deux drapeaux doivent s’aligner et ils résident sur des enregistrements différents : l’approbation de l’adresse e-mail de la file d’attente, et la boîte aux lettres approuvée par l’administrateur O365. Une file d’attente est créée en attente sur les deux, et seul un administrateur global Office 365 ou un administrateur Exchange peut approuver le second.
- Tester et activer la boîte aux lettres dans le centre d’administration Power Platform → Paramètres → Configuration des e-mails → Boîtes aux lettres. Elle envoie un message test de l’adresse vers elle-même, et la boîte ne l’envoie qu’une fois qu’elle a réussi.
create_email_queueL’exécute et rapporte le résultat.
Important
Une boîte aux lettres non approuvée ou non testée échoue silencieusement. Dataverse accepte l’email, l’enregistre et ne le livre jamais — ce qui, du côté du portail, est indiscernable d’un envoi réussi. Rien ne se jette, rien n’est enregistré comme une erreur, et le premier signe de problème est un utilisateur disant qu’il n’a jamais reçu son lien de confirmation. Si les emails d’enregistrement n’arrivent pas, vérifiez le statut sortant de la boîte mail avant toute autre chose : Not Run signifie que le test n’a jamais été exécuté, et Failure avec une alerte concernant la validation de la configuration de la boîte mail dans le serveur distant signifie que l’adresse n’a pas de boîte partagée dans Exchange Online.
check_email_senderSignale les deux, avec les alertes de la boîte aux lettres.
5. Garder les secrets dans le coffre à clés
Donnez à l’application une identité gérée, accordez-lui un accès de lecture à un coffre-fort, et placez l’URI de chaque secret dans les paramètres de l’application au lieu du secret lui-même. App Service résout la référence pour vous, et la valeur n’apparaît jamais dans la page de configuration, dans un script ou dans un journal de déploiement.
az webapp identity assign --name myportal --resource-group myportal-rg --query principalId --output tsv
az keyvault create --name myportal-kv --resource-group myportal-rg --enable-rbac-authorization true
az role assignment create --assignee PRINCIPAL_ID --role "Key Vault Secrets User" --scope VAULT_RESOURCE_ID
az keyvault secret set --vault-name myportal-kv --name D365--ClientSecret --value THE_SECRET
az webapp config appsettings set --name myportal --resource-group myportal-rg --settings D365__ClientSecret="@Microsoft.KeyVault(SecretUri=https://myportal-kv.vault.azure.net/secrets/D365--ClientSecret/)"
Quand un secret client expire — Entra est par défaut à un an — ajoutez une nouvelle version au coffre-fort et redémarrez l’application. Le paramètre de l’application lui-même ne change pas.
Le serveur MCP fait toute cette séquence : create_managed_identity crée une identité attribuée par l’utilisateur, enable_managed_identity l’attache à l’application, create_key_vault crée le coffre et accorde à cette identité l’accès à la lecture, puis les outils secrets acceptent destination: "key-vault" — ce qui envoie un secret client fraîchement créé d’Entra directement dans le coffre-fort et ne laisse que la référence dans les paramètres de l’application. La valeur ne devient jamais un réglage littéral et ne passe jamais entre les mains de personne. Les secrets déjà présents dans vos secrets utilisateur vont avec push_secrets_to_key_vault, qui vous demande de cocher chacun avant qu’il ne soit copié et pointe les paramètres correspondants de l’application vers eux ; check_deployment puis confirme que chaque secret de référence existe et que l’identité de l’application peut le lire.
Important
Un nom de Key Vault est réservé 90 jours après la suppression. La suppression progressive est activée par défaut et ne peut pas être désactivée, donc supprimer un vault ne libère pas son nom — recréer un nom portant le même nom dans cette fenêtre nécessite une purge explicite, qui nécessite elle-même une autorisation et est irréversible. C’est la seule ressource ici qui n’est pas facilement irréalisable, alors choisissez le nom aussi délibérément que celui du service d’applications.
Note
Mieux encore, supprimez complètement le secret client Dataverse. Réglez
D365__ManagedIdentityIdsur l’ID client d’une identité gérée et le portail authentifie Dataverse sous cette identité, sans secret et donc sans rien à expirer. Il n’y a pas de vérification d’environnement ni de commutateur de build : le paramètre appartient à la configuration du service d’application plutôt qu’àappsettings.json, donc il est absent localement et présent lors du déploiement, et une version se comporte correctement dans les deux. Utilisez une identité assignée par l’utilisateur — une identité assignée par le système est créée et détruite avec l’application et diffère selon le slot de déploiement, donc reconstruire l’application crée une nouvelle identité et orpheline l’utilisateur de l’application Dataverse construite sur l’ancienne. L’identité nécessite toujours cet utilisateur applicatif, créé à partir de son id d’application plutôt que de l’id principal affiché par le portail Azure en premier. Cela ne s’applique que lorsque l’App Service et l’environnement Dataverse sont dans le même locataire Entra ; s’ils ne le sont pas, voir Quand Dataverse est dans un autre locataire ci-dessous.
Lorsque Dataverse est dans un autre locataire
Tout ce qui précède suppose que le service d’applications et l’environnement Dataverse appartiennent au même locataire Entra — le cas habituel lorsqu’une organisation héberge son propre portail. Si vous gérez le portail et que votre client possède l’environnement Dataverse, ils sont dans des locataires différents, et l’avis d’identité change.
Important
Une identité gérée ne peut pas s’authentifier à Dataverse dans un autre locataire seul. Son principal de service appartient au locataire propre de l’abonnement et ne peut être consenti à celui de quelqu’un d’autre, il n’y a donc rien contre lequel le Dataverse du client puisse créer un utilisateur applicatif. Ne le
D365__ManagedIdentityIddéfinissez pas seul sous cette forme — le portail recevrait un jeton puis serait refusé à chaque appel, ce qui ressemble à un rôle de sécurité défaillant plutôt qu’à un mauvais type d’identité. Il peut cependant être l’accréditation d’une inscription multi-locataire, ce qui est ce qui traverse les locataires : voir la première option ci-dessous.
Le portail se connecte comme une inscription d’application pour laquelle le locataire du client a un principal de service. Il existe trois façons de gérer cela, et elles diffèrent quant à qui contrôle la durée de vie de l’identifiant :
- Un enregistrement multi-locataire que vous possédez — préférentiel. Créez-le dans votre propre locataire avec
signInAudiencel’autorisationAzureADMultipleOrgsdéléguéeUser.Readde Microsoft Graph et une URL de réponse — le consentement administrateur refuse une inscription sans les deux, bien que le portail n’utilise aucun des deux (create_dataverse_app_registrationles ajoute). Il ne quitte jamais votre locataire, et vous décidez quand son secret tourne et quand il expire — ce qui est la différence qui compte, car un secret expiré fait couler le portail et c’est là que la personne qui peut l’empêcher est la personne qui est appelée. Mieux encore, ne lui donnez aucun secret. Une identifiante fédérée permet à l’enregistrement d’accepter une identité gérée attribuée par l’utilisateur à la place d’une (add_app_registration_federated_credentiall’ajoute) ; associer l’identité au service d’application et la définirD365__ClientIdsur l’enregistrement,D365__TenantIdsur le locataire du client etD365__ManagedIdentityIdsur l’identifiant client de l’identité. Le portail prouve qu’il s’agit de l’application avec le jeton de l’identité, et rien n’expire. - Un enregistrement que le client crée dans son propre locataire. Certaines organisations l’exigent, et c’est pris en charge. Le coût est que la durée de vie de l’identifiant leur appartient : lorsque le secret expire, le portail s’arrête, et vous ne pouvez pas le renouveler. Mettez d’accord sur qui surveille la date d’expiration avant de choisir cela.
- L’enregistrement propre de Power Portals Pro — lorsque Power Portals Pro héberge le portail. Le client ne crée aucune inscription : son administrateur consent à l’identifiant
46c0b100-f468-4bfc-ba89-d128bceabe31client de Power Portals Pro, et son Dataverse obtient un utilisateur applicatif pour cela. L’hébergement de Power Portals Pro se connecte en tant qu’utilisateur géré, donc il n’y a pas de secret pour stocker, faire tourner ou expirer. Ce n’est pas une option pour un portail que vous gérez vous-même, car seuls les hébergeurs propres de Power Portals Pro peuvent se connecter sous cet appel. Son lien de consentement esthttps://login.microsoftonline.com/organizations/adminconsent?client_id=46c0b100-f468-4bfc-ba89-d128bceabe31&redirect_uri=https%3A%2F%2Fpowerportalspro.com%2F.
Quel que soit votre choix, un administrateur du locataire du client doit consentir une seule fois à l’enregistrement. C’est ce qui crée le principal du service — un objet portant votre identifiant client, auquel leur Dataverse peut ensuite lier un utilisateur d’application. Envoyez-leur ce lien :
https://login.microsoftonline.com/CUSTOMER_TENANT_ID/adminconsent?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REPLY_URL
Important
Le consentement vient avant l’utilisateur de l’application, pas après. Tant que cela n’a pas eu lieu, il n’y a pas de principal de service dans le locataire du client, donc la création de l’utilisateur de l’application Dataverse échoue à cause d’une erreur concernant une application inconnue — qui ne mentionne ni les locataires ni le consentement, et constitue le point le plus déroutant sur ce chemin. Vous ne pouvez pas effectuer cette étape pour eux : c’est leur locataire qui accorde l’accès à une inscription qu’il ne possède pas, donc il a besoin de leur autorité plutôt que de la vôtre.
Mettez ce secret dans Key Vault plutôt que dans un cadre applicatif. C’est une attestation sur les données de quelqu’un d’autre, et un réglage littéral est lisible pour quiconque utilise Contributor sur l’application et voyage avec toute exportation de la configuration. check_deployment Signalez-le si ce n’est pas le cas.
6. Publier
Publiez selon le framework, zipez la sortie, poussez le zip. Sur un portail React, la même dotnet publish chose construit aussi le SPA et le met en scène dans wwwroot.
dotnet publish ./MyPortal/MyPortal.csproj -c Release -o ./publish
Compress-Archive -Path ./publish/* -DestinationPath ./publish.zip -Force
az webapp deploy --name myportal --resource-group myportal-rg --src-path ./publish.zip --type zip
Zipez le contenu du dossier publié, pas le dossier lui-même — App Service décompresse l’archive directement dans la racine du site, donc un répertoire imbriqué de premier niveau produit un site qui ne sert à rien.
La boîte de dialogue Publish de Visual Studio fait la même chose de manière interactive, et un workflow GitHub Actions ou Azure Pipelines le fait sur push. La seule étape supplémentaire pour un portail React est une étape de configuration Node en avance sur la compilation, puisque dotnet publish le CP est fourni à npm.
7. Pointer la licence vers l’URL déployée
La licence du site web est liée à une URL. Dans l’application modèle Power Portals Pro, ouvrez (ou créez) l’enregistrement Portal Web contenant votre clé de licence et réglez son URL sur l’URL de production du portail que vous venez de déployer — https://myportal.azurewebsites.net, ou votre domaine personnalisé si un domaine est mis devant.
Enregistrez uniquement l’URL de production . La validation accepte -devégalement , -test, -uat, -stage et -prod les hôtes suffixés, ainsi que les mêmes cinq que les sous-domaines principaux, donc les autres environnements n’ont pas besoin d’enregistrement séparé. La page Licences contient la liste complète.
Important
Faites cela avant d’envoyer le trafic. Chaque point de terminaison de service de données vérifie la licence, donc tant que l’enregistrement n’existe pas et correspond à l’hôte, le portail affiche mais chaque appel de données revient
402.
8. Ajouter l’URI de redirection de production
Si le portail propose la connexion Microsoft, l’enregistrement de l’application de connexion ne connaît toujours que l’URI de redirection localhost. Ajoutez celui déployé à côté — Entra accepte plusieurs, donc le local continue de fonctionner :
https://myportal.azurewebsites.net/signin-microsoft
Même schéma pour les autres fournisseurs sur leurs propres chemins de rappel (/signin-google, /signin-facebook). Ajouter un par environnement, et un par domaine personnalisé.
Emplacements de déploiement
Un emplacement de staging et un swap vous offrent une application améliorée et un retour en arrière instantané. Ce sont la seule chose qui vaut vraiment la peine de quitter Basic — et la raison de le laisser quand on en a besoin, plutôt qu’à l’avance. Deux choses doivent être entretenues.
Les clés de protection des données sont par emplacement. ASP.NET Core conserve le trépositeur sous %HOME%, dont chaque emplacement a sa propre copie, donc un échange le remplace — et chaque cookie d’authentification émis par le slot précédent devient indéchiffrable. Tout le monde est déconnecté. Déplacez le porte-clés quelque part que les deux emplacements partagent avant de compter sur l’échange :
builder.Services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri(blobUri), new DefaultAzureCredential())
.ProtectKeysWithAzureKeyVault(new Uri(keyUri), new DefaultAzureCredential());
Marquez les réglages spécifiques à l’environnement comme réglages de slot pour qu’ils restent en arrière pendant un échange. L’URL de l’environnement Dataverse est celle qui prend le dessus : sans elle, échanger un emplacement de staging pointant vers un bac à sable favorise cette connexion bac à sable en production.
Mise en échelle,
L’échellement est une décision à prendre quand on mesure le besoin, pas lors de la provision. Une instance du niveau par défaut transporte une quantité surprenante de trafic de portail.
- Blazor Server / Auto : gardez l’affinité de session activée, et prévoyez environ 250 Ko de mémoire serveur par circuit concurrent comme point de départ avant de mesurer le vôtre. Azure SignalR Service n’est pas requis sur App Service — c’est un outil pour des connexions très élevées ou des utilisateurs distribués globalement.
- React / Blazor WebAssembly : désactivez l’affinité de session et remettez à l’échelle horizontale. Les requêtes sont sans état, donc les instances sont interchangeables.
- Les modèles s’enregistrent
AddDistributedMemoryCache(), ce qui correspond à chaque instance. Sur plusieurs instances, échangez-les contre un véritable cache distribué afin que les métadonnées et les caches de localisation soient partagés plutôt que reconstruits sur chacun.
Faire tout cela depuis un agent IA
Le serveur Power Portals Pro MCP peut effectuer toutes les étapes de cette page. Liez le dossier à un abonnement une fois, sur un terminal — le lien appartient à ce dossier, donc plusieurs projets peuvent cibler différents clients en même temps, et rien ne change à l’échelle de la machine :
ppp-mcp azure login
check_deployment— celui à atteindre en premier. Il compare ce dont le projet a besoin avec ce que possède le service d’applications et nomme ce qui ne va pas : un paramètre obligatoire qui n’a existé que dans vos secrets utilisateur, l’environnement laissé en Développement, WebSockets désactivés sur un portail Blazor, un enregistrement Portal Website qui ne couvre pas l’hôte, un portail qui ne peut pas accéder à Dataverse. Lecture seule, donc il est sûr de le faire tourner en production.get_deployment_plan— les étapes, et chaque niveau de plan avec son prix réel actuel issu de la liste publique de prix d’Azure.create_app_service— groupe de ressources, plan et application web, avec la paire WebSockets et affinité déjà configurée pour votre pile.set_app_service_settings— fusionne les paramètres au lieu de les remplacer, afin de ne pas effacer ceux qui contiennent vos secrets.deploy_to_app_service— construit avecdotnet publishet pousse le résultat.create_dataverse_app_registration,create_signin_app_registrationetadd_app_registration_redirect_uri— le côté Entra des étapes 6 et 7, en utilisant le rôle d’annuaire de votre compte connecté. Un secret client créé va directement dans les secrets utilisateur ou dans les paramètres du service App et n’est jamais affiché.create_managed_identity,enable_managed_identityetcreate_key_vault— l’identité et le coffre ci-dessus, avec les attributions de rôle faites pour vous et réessayées pendant qu’elles se propagent.get_deployment_planindique également si ce déploiement couvre deux locataires, etcreate_dataverse_app_registrationprendmultiTenant: truela forme hébergée — création de l’enregistrement, impression du lien de consentement administrateur, et insertion du secret directement dans le vault.create_email_queue— la file d’attente de l’expéditeur sans réponse de l’étape 4, créée, approuvée et testée en un seul appel, une fois que sa boîte aux lettres partagée existe dans Exchange Online.check_email_senderexplique pourquoi les courriels provenant de celle-ci n’arrivent pas.
Note
Chaque outil qui modifie quoi que ce soit dans Azure vous montre ce qu’il fera avant qu’on ne vous demande de confirmer, y compris le coût mensuel réel pour votre région, avec une note indiquant que la liste de détail ignore tout accord d’entreprise ou réservation que vous détenez. Les outils qui ne lisent jamais de notification. Le serveur n’utilise pas la ligne de ligne de ligne Azure et ne lit ni ne change jamais son état de connexion.
Dépannage
- Le site n’apparaît jamais. En général, un paramètre d’application manquant est requis. L’exception de démarrage nomme la clé — lisez-la dans Log stream ou Diagnostique et résolvez les problèmes.
- Le portail apparaît, mais affiche un avis « Certains contenus sont indisponibles », les étiquettes apparaissent comme leurs clés brutes et aucun chargement de données ne s’installe. Le portail ne peut pas se connecter à Dataverse. Le journal nomme la cause sur une ligne commençant Impossible de se connecter à Dataverse — généralement un message expiré ou incorrect
D365__ClientSecret, ou unD365__ClientIdautre locataire. Tant que cela dure,/healthrépond503 Unhealthy, donc un contrôle d’état d’un service d’applications ou un moniteur de disponibilité pointé vers lui le remarquera etcheck_deploymentle posera aussi. - Le portail affiche mais chaque appel de données retourne 402. La vérification de licence rejette l’hôte. Confirmez que l’URL de l’enregistrement du site web du portail correspond à l’hôte utilisé réellement par le navigateur, et que la solution gérée est installée dans l’environnement auquel le portail est connecté. Le rejet est enregistré avec l’hôte exact, l’hôte transféré et le schéma qui ont été validés.
- Boucles de redirection, ou une
http://URL là où vous vous attendiezhttps://à . L’application ne respecte pas les en-têtes transférés depuis la interface du service applicatif. RéglezASPNETCORE_FORWARDEDHEADERS_ENABLED=truele schéma de requête et l’IP du client reflètent la requête initiale. - « Échec de se connecter via WebSockets, en utilisant le plan de secours Long Polling » dans la console du navigateur sur un portail Blazor — Web Sockets est toujours désactivé sur le service d’application.
- Tout le monde est déconnecté après un déploiement ou un échange. Le porte-clés de protection des données a changé ; voir les emplacements de déploiement ci-dessus.
- Un lien profond React 404s ou redirige vers localhost.
ASPNETCORE_ENVIRONMENTn’est pasProduction— le plan de secours SPA n’est enregistré qu’en dehors du développement. - Rien d’utile dans les journaux. La journalisation des applications des services d’applications est désactivée par défaut : activez la journalisation du système de fichiers au niveau des informations, puis la suivez avec
az webapp log tail.
