Bereitstellung auf Azure App Service
Ein Power Portals Pro Portal ist eine Single ASP.NET Core-Anwendung, egal welchen Stack Sie wählen, daher ist die Bereitstellung auf einen gewöhnlichen App-Service eine normale dotnet publish Option. Diese Seite behandelt die zu erstellenden Ressourcen, die vom Portal geliehenen Einstellungen, die wir als Standardeinstellungen vorschlagen und die wenigen Schritte, die speziell für Power Portals Pro und nicht für ASP.NET Core gelten.
Was Sie einsetzen
Beide Vorlagen erzeugen eine Webanwendung und eine Veröffentlichungsausgabe. Es gibt keinen separaten Frontend-Host, keine statische Site-Ressource und keinen zweiten App Service:
- Blazor – das Serverprojekt hostet die App. Unter oder unter
ServerderAutoInteraktivität bedient es auch die Blazor SignalR-Schaltung; darunterWebAssemblybedient es das Client-Bündel und die Endpunkte, die/api/*der Client aufruft. - React –
dotnet publishführt den Vite-Build für das Client-Projekt aus und steuert ihndist/in den Hostwwwrootein, sodass einer ASP.NET Core-Host die SPA und die API von einem einzigen Ursprung aus bereitstellt. Nichts Zusätzliches zu verdrahten.
Anmerkung
Da der React Publish an npm ausliefert, muss Node auf dem laufenden Rechner installiert werden – auf deinem Laptop
dotnet publishoder dem Build-Agenten. Der Client der Vorlage fragt nach Node^20.19.0 || >=22.12.0. App Service selbst benötigt Node nie; er sieht immer nur die erstellte Ausgabe.
Vorgeschlagene Standardeinstellungen
Ausgangspunkte, keine Regeln – aber das sind das, was wir für ein neues Produktionsportal wählen würden.
- Betriebssystem: Linux. Günstiger pro Stufe, schneller zu starten, und es hält IIS
web.configkomplett aus dem Spiel. Windows funktioniert gut, wenn deine Organisation darauf standardisiert. - Laufzeit-Stack: .NET 10. Das Template-Ziel
net10.0. Veröffentlichen Sie framework-abhängig und lassen Sie App Service die Laufzeit liefern. - Plan: B3 – für jede Umgebung, inklusive Produktion. B3 ist das obere Element von Basic: Always On, vier Kerne und 7 GB, sodass ein Portal mit Headroom startet, anstatt seine Grenzen bei der ersten echten Last zu erreichen. Später wird die Stufe gewechselt, ein Befehl ohne Neuauslösung und ohne nennenswerte Ausfallzeiten – bis B1 für eine Entwicklungs- oder Testumgebung, die nie den Platz braucht. Was Basic dir nicht bietet: Deployment-Slots und Autoscale (beide starten bei Standard – und vergleichen Sie S1 mit P0v3, das unter Linux meist günstiger ist und mehr Speicher hat).
- Always On: An. App Service entlädt eine leere App, und ein Cold Start bedeutet, sich wieder mit Dataverse zu verbinden und die Metadaten- und Lokalisierungscaches neu aufzubauen. Der erste Besucher nach einer ruhigen Phase zahlt für alles.
- Nur HTTPS: Eingeschaltet, mindestens TLS 1.2, HTTP/2 aktiviert. Das Portal gibt Authentifizierungscookies aus; es gibt keinen Grund, reines HTTP zu akzeptieren.
- Web-Sockets: Für Blazor Server oder Auto eingeschaltet. Standardmäßig ist der App Service aus, und ohne ihn fällt die Leitung leise auf Long Poling zurück.
- Session-Affinität: Für Blazor Server oder Auto aktiviert – eine Schaltung gehört zu einer Instanz. Schalte sie für React- und Blazor WebAssembly-Portale aus: Diese sind über HTTP zustandslos, und Affinität bringt nur deine Instanzen aus dem Gleichgewicht.
- Geheimnisse im Key Vault, referenziert aus den App-Einstellungen. Geben Sie dem App Service eine verwaltete Identität und zeigen Sie die Einstellung auf den Tresor, sodass das Geheimnis niemals im Konfigurations-Blade oder in einem Deployment-Skript liegt.
- Datenschutzschlüssel im Blob Storage , sobald du Deployment-Slots nutzt oder über eine Instanz hinaus skalierst. Der Standard-Schlüsselring ist pro Slot, und ein Swap meldet alle ab.
WEBSITE_RUN_FROM_PACKAGE=1: optional und lohnenswert. Deployments werden atomar und das Inhaltsverzeichnis nur lesbar. Das Portal liest immer nur von seinem Inhaltsroot, sodass nichts kaputtgeht – es lädt den Puffer über den temporären Systemordner hoch, der beschreibbar bleibt.- Anwendungs-Einblicke: an. Das Framework protokolliert Lizenzablehnungen und Dataverse-Fehler durch
ILogger. Ohne Sink liest du den Logstream von Hand genau zu dem Moment, in dem du es lieber nicht tun würdest.
1. Erstellen Sie den App-Dienst
Drei Befehle. Ersetze deine eigenen Namen – myportal wird auf dieser Seite verwendet.
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"
Der Name der Webanwendung wird https://myportal.azurewebsites.net und muss global eindeutig sein. Wählen Sie ihn bewusst: Wenn Sie keine benutzerdefinierte Domain vorne setzen, ist es die URL, an die Ihr Lizenzschlüssel gebunden wird.
2. Setzen Sie die Plattformoptionen ein
Das sind die, deren Standardwerte für ein Portal falsch sind.
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— erforderlich für Blazor Server und Auto. Harmless auf React- und WebAssembly-Portalen, die niemals eine Schaltung öffnen.--client-affinity-enabled— es für Blazor Server und Auto belassen; für React und Blazor WebAssembly überlassentruefalse, damit Anfragen gleichmäßig über Instanzen verteilt sind.--always-on true— Basis-Stufe oder höher. Es ist nicht in kostenlosen oder geteilten Tarifen verfügbar.
3. Konfiguration
App-Service-Anwendungseinstellungen erscheinen als Umgebungsvariablen und überschreiben appsettings.json, was genau das ist, was du willst: Lass die Datei in Ruhe und setze hier die Werte pro Umgebung.
Wichtig
Benutzergeheimnisse werden nicht übertragen. Alles, was
dotnet user-secretsdu während der Entwicklung gespeichert hast, lebt nur auf deinem Rechner. Jeder dieser Schlüssel muss als Anwendungseinstellung – oder als Key Vault-Referenz – neu erstellt werden, sonst startet die bereitgestellte App nicht.
Verwenden Sie einen doppelten Unterstrich für den Abschnittstrenner: D365:ClientId wird zu D365__ClientId. Die Doppelpunktform funktioniert unter Windows App Service, aber nicht unter Linux, ebenso __ wie das Formular, das überall verwendet werden kann.
Immer notwendig
D365__Url— die URL der Dataverse-Umgebung, z. B.https://yourorg.crm.dynamics.com. Kein Geheimnis.D365__ClientId— die Client-ID der Entra-App-Registrierung, als die das Portal mit Dataverse verbunden ist. Kein Geheimnis.D365__ClientSecret– das Client-Geheimnis dieser Registrierung. Geheimnis: Verwenden Sie eine Key Vault-Referenz.D365__EmailSenderEmailAddress— die From-Adresse, von der das Portal Kontobestätigungs- und Passwort-Zurücksetzungsmails über Dataverse sendet. Am einfachsten zu vergessen, weil sie nicht darinappsettings.jsonist und die App ohne sie nicht startet.ASPNETCORE_ENVIRONMENT— setzen Sie es aufProduction. Dies ändert nicht nur die Fehlerseite: Auf einem React-Portal wird der SPA-Fallback nur außerhalb der Entwicklung registriert, sodass eine verbleibendeDevelopmentSeite Deep Links umleitet, anstatt die App zuhttp://localhost:5173servieren.
Erforderlich, wenn du diesen Anmeldeanbieter aktiviert hast
Authentication__Microsoft__ClientIdundAuthentication__Microsoft__ClientSecret– die Anmelderegistrierung, die eine andere App-Registrierung ist als die Dataverse-Registrierung. Siehe Entra ID Sign-In.Authentication__Google__ClientIdundAuthentication__Google__ClientSecret.Authentication__Facebook__AppIdundAuthentication__Facebook__AppSecret.
Optional
Azure__Translation__Key,DeepL__Translation__KeyoderGoogle__Translation__Key– je nachdem, welcher Maschinenübersetzungsanbieter Sie registriert haben. Lassen Sie es undeaktiviert, und die Seite zur Lokalisierungsverwaltung versteckt einfach ihr Übersetzungspanel; der Rest der Seite funktioniert weiterhin.Security__SystemAdminRoleName— die Dataverse-Sicherheitsrolle, die Portaladministratoren Zugriff gewährt. Sie wird ausgeliefertappsettings.json; überschreibe sie hier, wenn der Rollenname je nach Umgebung unterschiedlich ist.
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"
Anmerkung
Die erforderlichen Schlüssel werden mit
GetRequiredValuegelesen, sodass ein fehlender Schlüssel beim Start ausgelöst wird, anstatt später beim ersten Dataverse-Aufruf fehlzuschlagen. Im App Service erscheint das als eine Seite, die nie auftaucht – lies den Logstream, und die Ausnahme nennt den Schlüssel.
4. Geben Sie dem Portal eine Adresse an, von der es senden kann
D365__EmailSenderEmailAddress ist das, woher Kontobestätigung und Passwort-Reset-Mails stammen, und das Framework löst das, indem es nach einem Dataverse-Nutzer mit dieser Adresse, dann einer Warteschlange und schließlich einem Team sucht. Verwenden Sie eine Warteschlange. Ihre Adresse benötigt eine gemeinsame Mailbox in Exchange Online, die keine Lizenz erfordert, und alles andere passiert in Dataverse. Die Einstellung auf eine reale Person zu richten, kostet Sie stattdessen drei Dinge:
- Ihr Name steht auf jeder automatischen Nachricht. Empfänger sehen einen Kollegen als Absender eines Passwort-Zurücksetzens, das er nicht gesendet hat.
- Antworten landen in ihrem Posteingang. Menschen antworten auf E-Mails, die keine Antwort haben, und diese Antworten landen irgendwohin, wo niemand sie beobachtet.
- Das Portal bricht, wenn sie gehen. Das Deaktivieren des Kontos nimmt den Absender mit, und der Fehler taucht als Kontobestätigung auf, die leise nicht funktioniert.
Vier Schritte: einer in Exchange, dann drei in Dataverse. Der MCP-Server führt die drei Dataverse-Schritte in einem Aufruf mit create_email_queuedurch, und check_email_sender gibt an, welcher Schritt fehlt, wenn keine E-Mail ankommt:
- Erstelle ein geteiltes Postfach mit der Adresse im Exchange-Verwaltungszentrum (Empfänger → Postfächer → Fügen Sie eine gemeinsame Mailbox hinzu). Es ist keine Lizenz erforderlich. Das ist die Server-seitige Synchronisation, sodass ohne sie der letzte Schritt mit einem Fehler zur Validierung der Postfach-Konfiguration auf dem entfernten Server fehlschlägt.
- Erstelle eine private Warteschlange mit der Adresse (z. B.
noreply@contoso.com), eingehende Lieferung Keine und ausgehende Zustellung Server-Side Synchronization. Der Name der Warteschlange ist das, was die Empfänger als Absender sehen, daher benennen sie sie nach dem Portal und nicht nach einer Person. - Genehmigen Sie die Adresse. Zwei Flags müssen übereinstimmen und befinden sich auf unterschiedlichen Datensätzen: die eigene E-Mail-Adressgenehmigung der Warteschlange und die Genehmigung der Postfachadresse durch den O365-Administrator. Eine Warteschlange wird bei beiden anstehend erstellt, und nur ein Office 365 Global Administrator oder Exchange Administrator kann die zweite Karte genehmigen.
- Testen und aktivieren Sie das Postfach unter Power Platform Admin Center → Einstellungen → E-Mail-Konfiguration → Postfächer. Es sendet eine Testnachricht von der Adresse an sich selbst, und das Postfach wird erst gesendet, wenn es erfolgreich ist.
create_email_queueEs wird ausgeführt und das Ergebnis gemeldet.
Wichtig
Ein nicht genehmigtes oder nicht getestetes Postfach scheitert stillschweigend. Dataverse akzeptiert die E-Mail, zeichnet sie auf und liefert sie nie aus – was aus Portalsicht nicht von einer erfolgreichen Sendung zu unterscheiden ist. Nichts wird angezeigt, nichts wird als Fehler protokolliert, und das erste Anzeichen von Problemen ist, dass ein Nutzer sagt, er habe seinen Bestätigungslink nie erhalten. Wenn Registrierungs-E-Mails nicht eintreffen, überprüfen Sie zuerst den ausgehenden Status des Postfachs: Nicht ausgeführt bedeutet, dass der Test nie ausgeführt wurde, und Fehler mit einer Warnung zur Validierung der Postfach-Konfiguration auf dem entfernten Server bedeutet, dass die Adresse in Exchange Online kein gemeinsames Postfach hat.
check_email_sendermeldet beides, mit den Benachrichtigungen des Postfachs.
5. Bewahren Sie die Geheimnisse im Key Vault auf
Gib der App eine verwaltete Identität, gewähre ihr Lesezugriff auf einen Tresor und gib die URI jedes Geheimnisses in die App-Einstellung ein, anstatt das Geheimnis selbst. App Service löst die Referenz für dich auf, und der Wert erscheint weder im Konfigurationsblade, in einem Skript noch in einem Deployment-Log.
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/)"
Wenn ein Client-Geheimnis abläuft – Entra steht standardmäßig auf ein Jahr – fügen Sie dem Tresor eine neue Version hinzu und starten Sie die App neu. Die App-Einstellung selbst ändert sich nicht.
Der MCP-Server führt diese ganze Sequenz durch: create_managed_identity Erstellt eine vom Benutzer zugewiesene Identität, enable_managed_identity hängt sie der App zu, create_key_vault erstellt den Tresor und gewährt dieser Identität Lesezugriff, und die geheimen Tools akzeptieren destination: "key-vault" es dann – wodurch ein frisch erstelltes Client-Geheimnis von Entra direkt in den Tresor gesendet wird und nur die Referenz in den App-Einstellungen bleibt. Der Wert wird nie zu einer wörtlichen Einstellung und geht nie durch die Hände von jemandem. Geheimnisse, die bereits in deinen Benutzergeheimnissen sind, gehen mit push_secrets_to_key_vault, was dich auffordert, jedes einzelne anzukreuzen, bevor es kopiert wird, und weist die entsprechenden App-Einstellungen darauf hin; dann bestätigt es, check_deployment dass jedes Referenzgeheimnis existiert und dass die Identität der App es lesen darf.
Wichtig
Der Name eines Key Vaults ist 90 Tage nach der Löschung reserviert. Soft Delete ist standardmäßig aktiviert und kann nicht deaktiviert werden, sodass das Löschen eines Tresors seinen Namen nicht freigibt – das Wiederherstellen eines Vaults mit demselben Namen innerhalb dieses Fensters erfordert eine explizite Löschung, die wiederum eine Berechtigung erfordert und irreversibel ist. Es ist die einzige Ressource hier, die nicht billig unmöglich ist, also wählen Sie den Namen genauso bewusst wie den des App Service.
Anmerkung
Noch besser: Lassen Sie das Dataverse-Client-Geheimnis ganz fallen. Setzen
D365__ManagedIdentityIdSie auf die Client-ID einer verwalteten Identität und das Portal authentifiziert sich als diese Identität bei Dataverse, ohne Geheimnis und daher ohne Ablauf. Es gibt keine Umgebungsprüfung und keinen Build-Switch: Die Einstellung gehört in die Konfiguration des App Services undappsettings.jsonnicht in , sodass sie lokal fehlt und bei der Bereitstellung vorhanden ist, und ein Build verhält sich in beiden korrekt korrekt. Verwenden Sie eine benutzerzugewiesene Identität – eine systemzugewiesene wird mit der App erstellt und vernichtet, die je nach Deployment-Slot unterschiedlich ist, sodass beim Neuaufbau der App eine neue Identität entsteht und der Dataverse-Anwendungsbenutzer, der auf der alten basiert, verwaist wird. Die Identität benötigt weiterhin diesen Anwendungsbenutzer, erstellt aus seiner Anwendungs-ID und nicht aus der Haupt-ID, die das Azure-Portal zuerst anzeigt. Dies gilt nur, wenn sich der App Service und die Dataverse-Umgebung im selben Entra-Mandanten befinden; falls nicht, siehe "Wenn Dataverse in einem anderen Tenant ist " unten.
Wenn Dataverse in einem anderen Tenant ist
Alles oben Genannte setzt voraus, dass der App Service und die Dataverse-Umgebung zum selben Entra-Tenant gehören – der übliche Fall, wenn eine Organisation ihr eigenes Portal hostet. Wenn Sie das Portal betreiben und Ihr Kunde die Dataverse-Umgebung besitzt, befinden sie sich in unterschiedlichen Tenants, und die Identity Advice ändert sich.
Wichtig
Eine verwaltete Identität kann sich nicht allein bei Dataverse in einem anderen Tenant authentifizieren. Ihr Service Principal gehört zum eigenen Tenant des Abonnements und kann nicht in den von jemand anderem eingewilligt werden, sodass es nichts gibt, wogegen das Dataverse des Kunden einen Anwendungsbenutzer erstellen könnte. Setzen
D365__ManagedIdentityIdSie nicht allein in dieser Form – das Portal würde ein Token erhalten und dann bei jedem Anruf abgelehnt werden, was sich eher wie eine defekte Sicherheitsrolle als wie die falsche Art von Identität anfühlt. Es kann jedoch auch die Zugangsdaten einer Multi-Tenant-App-Registrierung sein, die die Grenze zwischen den Tenants überschreitet: siehe die erste Option unten.
Das Portal meldet sich als App-Registrierung an, für die der Mieter des Kunden einen Service Principal hat. Es gibt drei Möglichkeiten, das zu organisieren, und sie unterscheiden sich darin, wer die Lebensdauer der Zugangsdaten kontrolliert:
- Eine Multi-Tenant-Registrierung, die du besitzt – bevorzugt. Erstelle sie in deinem eigenen Tenant mit
signInAudienceMicrosoftAzureADMultipleOrgsGraphs delegierterUser.ReadBerechtigung und einer Antwort-URL – die Zustimmung des Administrators verweigert eine Registrierung ohne beides, obwohl das Portal keine von beiden verwendet (create_dataverse_app_registrationfügt sie hinzu). Sie verlässt deinen Tenant nie, und du entscheidest, wann sein Geheimnis rotiert und wann es abläuft – und das ist der entscheidende Unterschied, denn ein abgelaufenes Geheimnis schaltet das Portal herunter, und das ist die Option, bei der die Person, die das verhindern kann, die Person ist, die aufgerufen wird. Noch besser: Gib ihm überhaupt kein Geheimnis. Eine föderierte Zugangsdaten ermöglicht es der Registrierung, eine vom Benutzer zugewiesene verwaltete Identität anstelle einer zu akzeptieren (add_app_registration_federated_credentialfügt sie hinzu); die Identität wird dem App Service zugeordnet und der Registrierung,D365__TenantIddem Kundenmieter undD365__ManagedIdentityIdder Client-ID der Identität zugewiesenD365__ClientId. Das Portal beweist, dass es die App mit dem Token der Identität ist, und nichts verfällt. - Eine Registrierung, die der Kunde in seinem eigenen Tenant erstellt. Einige Organisationen verlangen dies, und sie wird unterstützt. Die Kosten sind, dass die Lebensdauer der Zugangsdaten ihnen gehört: Wenn das Geheimnis abläuft, stoppt das Portal und du kannst es nicht verlängern. Vereinbare dich, wer das Ablaufdatum überwacht, bevor du das auswählst.
- Power Portals Pros eigene Registrierung – wenn Power Portals Pro das Portal hostet. Der Kunde erstellt keine Registrierung: Sein Administrator stimmt der Client-ID
46c0b100-f468-4bfc-ba89-d128bceabe31von Power Portals Pro zu, und sein Dataverse bekommt einen Anwendungsnutzer dafür. Power Portals Pros Hosting meldet sich mit einer verwalteten Identität an, sodass es kein Geheimnis gibt, das gespeichert, rotiert oder ablaufen muss. Es ist keine Option für ein Portal, das Sie selbst betreiben, da nur Power Portals Pros eigenes Hosting sich als Portal anmelden kann. Der Zustimmungslink isthttps://login.microsoftonline.com/organizations/adminconsent?client_id=46c0b100-f468-4bfc-ba89-d128bceabe31&redirect_uri=https%3A%2F%2Fpowerportalspro.com%2F.
Egal, wofür du dich entscheidest, ein Administrator im Kunden-Tenant muss der Registrierung einmal zustimmen. Das ist es, was dort den Service Principal erstellt – ein Objekt, das deine Client-ID trägt, an das ihr Dataverse dann einen Anwendungsbenutzer binden kann. Schick ihnen diesen Link:
https://login.microsoftonline.com/CUSTOMER_TENANT_ID/adminconsent?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REPLY_URL
Wichtig
Die Zustimmung kommt vor dem Anwendungsbenutzer, nicht danach. Bis es geschehen ist, gibt es keinen Service-Principal im Kunden-Tenant, daher scheitert das Erstellen des Dataverse-Anwendungsbenutzers mit einem Fehler über eine unbekannte Anwendung – der weder Tenants noch Zustimmung erwähnt und der verwirrendste Punkt auf diesem Weg ist. Diesen Schritt können Sie nicht für sie ausführen: Es ist ihr Tenant, der Zugriff auf eine Registrierung gewährt, die er nicht besitzt, daher benötigt sie ihre Autorität statt deine.
Speichern Sie dieses Geheimnis in Key Vault statt in einer Anwendungseinstellung. Es handelt sich um eine Zugangsdaten gegen die Daten einer anderen Person, und eine wörtliche Einstellung ist von jedem mit Beitrag in der App lesbar und wird mit jedem Export der Konfiguration übertragen. check_deployment Melden Sie es, falls nicht.
6. Veröffentlichen
Framework-abhängig veröffentlichen, die Ausgabe zippen, die Zip pushen. Auf einem React-Portal baut dasselbe dotnet publish auch das SPA und stadelt es in 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
Zippen Sie den Inhalt des Publishing-Ordners, nicht des Ordners selbst – App Service entpackt das Archiv direkt in die Wurzel der Website, sodass ein verschachteltes Top-Level-Verzeichnis eine Seite erzeugt, die nichts bedient.
Der Publishing-Dialog von Visual Studio macht das Gleiche interaktiv, und ein GitHub Actions oder Azure Pipelines-Workflow macht das auf Push. Der einzige zusätzliche Schritt für ein React-Portal ist ein Node-Setup-Schritt vor dem Build, da dotnet publish es an NPM auslagert.
7. Die Lizenz auf die bereitgestellte URL zeigen
Die Website-Lizenz ist an eine URL gebunden. In der modellgetriebenen App Power Portals Pro öffnen (oder erstellen) Sie den Portal-Website-Eintrag mit Ihrem Lizenzschlüssel und setzen die URL auf die Produktions-URL des gerade installierten Portals – https://myportal.azurewebsites.netoder auf Ihre eigene Domain, falls eine davon vorankommt.
Registrieren Sie nur die Produktions-URL . Die Validierung akzeptiert -devauch , -test, -uat, -stage und -prod Suffix-Hosts sowie dieselben fünf als führende Subdomains, sodass andere Umgebungen keinen separaten Datensatz benötigen. Die Lizenzierungsseite enthält die vollständige Liste.
Wichtig
Mach das, bevor du den Datenverkehr sendest. Jeder datenbereitende Endpunkt überprüft die Lizenz, sodass das Portal angezeigt wird, bis der Datensatz existiert und mit dem Host übereinstimmt, aber jeder Datenaufruf kommt zurück
402.
8. Fügen Sie die Produktionsumleitung URI hinzu
Wenn das Portal eine Microsoft-Anmeldung anbietet, kennt die Registrierung der Anmelde-App immer noch nur deine localhost-Redirect-URI. Füge die bereitgestellte URI dazu hinzu – Entra akzeptiert mehrere, sodass die lokale weiterhin funktioniert:
https://myportal.azurewebsites.net/signin-microsoft
Dasselbe Muster gilt für die anderen Anbieter auf ihren eigenen Callback-Pfaden (/signin-google, /signin-facebook). Fügen Sie pro Umgebung einen und einen pro benutzerdefinierten Domain hinzu.
Einsatzplätze
Ein Staging-Slot und ein Tausch geben dir eine aufgewärmte App und einen sofortigen Rollback. Sie sind das Einzige, wofür es sich wirklich lohnt, Basic zu verlassen – und der Grund, es zu verlassen, wenn du sie brauchst, statt im Voraus. Zwei Dinge brauchen Pflege.
Datenschutzschlüssel sind pro Slot. ASP.NET Core speichert den Schlüsselring unter %HOME%, von dem jeder Slot eine eigene Kopie hat, sodass ein Swap ihn ersetzt – und jedes Authentifizierungscookie, das vom vorherigen Slot ausgegeben wird, wird unentschlüsselbar. Alle sind ausgeloggt. Stellen Sie den Schlüsselring an einen Ort, an dem beide Slots gemeinsam sind, bevor Sie auf Swapping setzen:
builder.Services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri(blobUri), new DefaultAzureCredential())
.ProtectKeysWithAzureKeyVault(new Uri(keyUri), new DefaultAzureCredential());
Markiere die umgebungsspezifischen Einstellungen als Slot-Einstellungen , damit sie während eines Swaps zurückbleiben. Die URL der Dataverse-Umgebung ist diejenige, die ankommt: Ohne sie bringt das Tauschen eines Staging-Slots, der auf eine Sandbox zeigt, diese Sandbox-Verbindung in die Produktion.
Skalieren
Skalieren ist eine Entscheidung, die man trifft, wenn man den Bedarf dafür misst, nicht wenn man bereitstellt. Eine Instanz der Standardstufe führt überraschend viel Portal-Verkehr.
- Blazor Server / Auto: Behalten Sie die Sitzungsaffinität an und planen Sie etwa 250 KB Serverspeicher pro gleichzeitiger Leitung als Ausgangspunkt ein, bevor Sie Ihren eigenen messen. Azure SignalR Service ist in App Service nicht erforderlich – es ist ein Werkzeug für sehr hohe Verbindungszahlen oder global verteilte Nutzer.
- React / Blazor WebAssembly: Schalte die Sitzungsaffinität aus und skaliere horizontal. Die Anfragen sind zustandslos, daher sind Instanzen austauschbar.
- Die Vorlagen registrieren
AddDistributedMemoryCache(), was pro Instanz ist. In mehr als einer Instanz tauschen Sie sie gegen einen echten verteilten Cache, sodass Metadaten- und Lokalisierungscaches geteilt werden und nicht auf jedem einzelnen neu aufgebaut werden.
All das von einem KI-Agenten aus erledigt
Der Power Portals Pro MCP-Server kann jeden Schritt auf dieser Seite ausführen. Binden Sie den Ordner einmal an ein Abonnement, an einem Terminal – die Bindung gehört zu diesem Ordner, sodass mehrere Projekte gleichzeitig verschiedene Kunden ansprechen können und sich maschinell nichts ändert:
ppp-mcp azure login
check_deployment– denjenigen, den man zuerst greifen muss. Es vergleicht, was das Projekt braucht, mit dem, was der App Service hat, und benennt, was falsch ist: eine erforderliche Einstellung, die nur in Ihren Benutzergeheimnissen existierte, die Umgebung, die auf Entwicklung verbleibt, WebSockets auf einem Blazor-Portal, ein Portal-Website-Eintrag, der den Host nicht abdeckt, ein Portal, das nicht auf Dataverse zugehörig ist. Schreibgeschützt, daher ist es sicher, es gegen die Produktion auszuführen.get_deployment_plan— die Schritte und jede Planstufe mit ihrem aktuellen tatsächlichen Preis aus Azures öffentlicher Preisliste.create_app_service— Ressourcengruppe, Plan und Web-App, wobei das WebSocket- und Affinity-Paar bereits für Ihren Stack festgelegt ist.set_app_service_settings— führt Einstellungen zusammen, anstatt sie zu ersetzen, sodass sie die Einstellungen mit deinen Geheimnissen nicht löschen kann.deploy_to_app_service— baut sich mitdotnet publishund pusht das Ergebnis voran.create_dataverse_app_registration,create_signin_app_registrationundadd_app_registration_redirect_uri— die Entra-Seite der Schritte 6 und 7, wobei Sie die Verzeichnisrolle Ihres eigenen angemeldeten Kontos verwenden. Ein erstelltes Client-Geheimnis geht direkt in die Benutzergeheimnisse oder die App Service-Einstellung und wird nie angezeigt.create_managed_identity,enable_managed_identityundcreate_key_vault— die Identität und der Tresor darüber, mit den für dich erstellten Rollenzuweisungen und erneut versucht, während sie sich weiterentwickeln.get_deployment_planGibt außerdem an, ob diese Bereitstellung zwei Tenants umfasst undcreate_dataverse_app_registrationfür die gehostete Form verwendetmultiTenant: true– die Registrierung erstellt, den Admin-Consent-Link ausdruckt und das Geheimnis direkt in den Tresor legt.create_email_queue— die No-Response-Absender-Warteschlange aus Schritt 4, erstellt, genehmigt und in einem Aufruf getestet, sobald ihr gemeinsames Postfach in Exchange Online existiert.check_email_sendererklärt, warum die Post von ihr nicht ankommt.
Anmerkung
Jedes Tool, das in Azure etwas ändert, zeigt Ihnen, was es tun wird, bevor Sie zur Bestätigung gebeten werden, einschließlich der tatsächlichen monatlichen Kosten für Ihre Region, mit dem Hinweis, dass die Einzelhandelsliste jede Enterprise Agreement oder Reservierung ignoriert, die Sie halten. Werkzeuge, die nur lesen, fordern nie. Der Server verwendet die Azure-CLI nicht und liest oder ändert nie seinen angemeldeten Zustand.
Fehlerbehebung
- Die Seite taucht nie auf. Meistens fehlt eine erforderliche App-Einstellung. Die Start-Ausnahme nennt den Schlüssel – liest ihn im Logstream oder bei Diagnose und löst Probleme.
- Das Portal erscheint, zeigt aber eine Meldung "Einige Inhalte sind nicht verfügbar" an, Labels erscheinen als ihre Rohschlüssel und keine Datenlade. Das Portal kann sich nicht bei Dataverse anmelden. Das Protokoll nennt die Ursache auf einer Zeile, beginnend mit "Konnte sich nicht mit Dataverse verbinden " – meist ein abgelaufener oder falscher
D365__ClientSecretArtikel oder einD365__ClientIdvon einem anderen Tenant. Solange es dauert,/healthantwortet503 Unhealthy, sodass ein App Service Gesundheitscheck oder ein verfügbarer Monitor, der darauf zeigt, es bemerkt undcheck_deploymentebenfalls fragt. - Das Portal wird angezeigt, aber jeder Datenaufruf gibt 402 zurück. Die Lizenzprüfung lehnt den Host ab. Bestätigen Sie, dass die URL des Portal-Website-Datensatzes mit dem Host übereinstimmt, den der Browser tatsächlich nutzt, und dass die verwaltete Lösung in der Umgebung installiert ist, mit der das Portal verbunden ist. Die Ablehnung wird mit genau dem Host, dem weitergeleiteten Host und dem Schema protokolliert, die validiert wurden.
- Umleitungsschleifen oder eine
http://URL dorthin, wo Sie erwartethttps://haben. Die App berücksichtigt die weitergeleiteten Header vom App Service Frontend nicht. Stellen Sie so ein,ASPNETCORE_FORWARDEDHEADERS_ENABLED=truedass das Anfrageschema und die Client-IP die ursprüngliche Anfrage widerspiegeln. - "Failed to connect via WebSockets, using the Long Polling Fallback" in der Browser-Konsole eines Blazor-Portals — Web Sockets ist im App Service weiterhin ausgeschaltet.
- Jeder ist nach einer Bereitstellung oder einem Swap abgemeldet. Der Datenschutz-Schlüsselring wurde geändert; siehe oben Deployment-Slots.
- Ein React Deep Link 404s oder leitet zu localhost
ASPNETCORE_ENVIRONMENTum. ist nichtProduction– der SPA-Fallback wird nur außerhalb der Entwicklung registriert. - Nichts Nützliches in den Protokollen. App Service Anwendungsprotokollierung ist standardmäßig deaktiviert: Dateisystemprotokollierung auf Informationsebene aktivieren und dann mit Tail ausführen
az webapp log tail.
