Projektvorlagen
PowerPortalsPro liefert zwei Projektvorlagen, die ein komplettes Portal – Dataverse-Konnektivität, Authentifizierung, Sicherheits-Handler, Lokalisierung und vorgefertigte Identitätsseiten – unterstützen und in wenigen Minuten einsatzbereit sind. Eine React-Einzelseiten-App (empfohlen) und eine Blazor-Webanwendung sind beide verfügbar, und das PowerPortalsPro-Funktionsset ist bei beiden identisch. Wähle den Frontend-Stack, der zu deinem Team passt.
Installation der Vorlagen
Installiere das PowerPortalsPro.AspNetCore.Templates-Paket von NuGet über die .NET CLI. Beide Vorlagen werden in diesem einen Paket ausgeliefert:
dotnet new install PowerPortalsPro.AspNetCore.Templates
Auswahl einer Vorlage
Nach der Installation erstellen Sie ein Projekt aus der .NET CLI oder dem Visual Studio-Dialog "Neues Projekt" (suchen Sie nach "Power Portals Pro"). Es stehen zwei Vorlagen zur Verfügung – wählen Sie diejenige, die zu Ihrem Frontend-Stack passt:
React (Empfohlen)
Ein ASP.NET Core-Host, kombiniert mit einer React + Vite + TypeScript einseitigen App, die auf Fluent UI React basiert. Empfohlen für neue Portale – moderne Frontend-Werkzeuge, eine schnelle Hot-Reload-Entwicklungsschleife und der breiteste Komponentenset.
dotnet new powerportalspro-react -o MyPortal
Blazor
Eine ASP.NET Core Blazor Web-App, die auf Fluent UI Blazor basiert, mit einem Rendermodus, den man zur Gerüstzeit über --interactivitywählt. Eine großartige Kombination, wenn dein Team hauptsächlich in C# arbeitet und lieber komplett im .NET-UI-Stack bleibt.
dotnet new powerportalspro -o MyPortal --interactivity Auto
Empfohlen
Beide Vorlagen bieten dieselben PowerPortalsPro-Funktionen – Grids, Editoren, Sicherheit, Lokalisierung und Identität. Wir empfehlen React für neue Projekte, es sei denn, Ihr Team hat einen bestimmten Grund, komplett C# zu wählen, dann wird die Blazor-Vorlage vollständig unterstützt.
Die React-Vorlage
Die Vorlage powerportalspro-react generiert zwei Projekte, die gemeinsam laufen:
- ASP.NET Core-Host – bedient die Daten- und Authentifizierungsendpunkte des Frameworks unter
/api/*und hostet das gebaute SPA. EsProgram.csist ähnlich wie der Blazor-Host konfiguriert (Dataverse-Verbindung, Lokalisierung, Sicherheitshandler) und stellt die JSON-Authentifizierungsendpunkte überMapAuthEndpoints<PortalUser>()offen. - React Client (
.Client) — ein Vite + TypeScript SPA, das auf Fluent UI React basiert und die@powerportalspro/core,@powerportalspro/react, ,@powerportalspro/react-fluentsowie@powerportalspro/react-chartsPakete für die Transportschicht, Hooks und Komponenten verbraucht. - Dev Loop – Drücke F5 (oder starte
dotnet run) auf dem Host, und der SpaProxy startet den Vite-Dev-Server für dich, mit Hot-Module-Reload bei Client-Bearbeitungen. Kein separates Terminal erforderlich. - Gleiche Oberfläche wie Blazor – Beispielseiten für Konten / Kontakte, Seiten für Identität und Kontoverwaltung, Tabellenberechtigungshandler, Navigation sowie Theme-/Site-Einstellungen, alle neu aufgebaut mit React-Komponenten.
Blazor-Interaktivitätsmodi
Die Blazor-Vorlage akzeptiert --interactivity Serverzusätzlich , --interactivity WebAssembly, oder --interactivity Auto um den Rendermodus zu wählen (die React-Vorlage ist immer eine einseitige App, daher gibt es keine entsprechende Option). Die vorangehende Wahl eines Modus beeinflusst nur das generierte Projektlayout – PowerPortalsPro selbst läuft unter allen drei Modi korrekt. Siehe die Seite Blazor Interactivity für einen vollständigen Vergleich.
- Server — interaktive Seiten werden auf dem Server über eine SignalR-Verbindung ausgeführt. Die einfachste Bereitstellung und der kleinste Client-Download. Gute Standardlösung, wenn man unsicher ist.
- WebAssembly — interaktive Seiten werden im Browser als kompilierter .NET-Code ausgeführt. Scaffold ein separates
.ClientProjekt; der Server hostet die vom Client verbrauchten API-Endpunkte. Am besten für reichhaltige clientseitige UX und die Entlastung der Interaktionsarbeit vom Server. - Auto — rendert den ersten Lack auf dem Server für eine schnelle wahrgenommene Last und übergibt dann transparent, sobald das Client-Bundle heruntergeladen ist. Vereint das Beste von beidem auf Kosten eines etwas komplexeren Projektlayouts.
Tipp
Die Flagge
--interactivitystimmt mit derdotnet new blazorgleichnamigen Standard-Vorlage überein, sodass alles, was du bereits über Blazor-Rendermodi weißt, übernommen wird.
Template-Optionen
Beide Vorlagen bieten dotnet new Optionen an, sodass du das erstellte Projekt von Anfang an anpassen kannst. Übergeben Sie sie über die Kommandozeile oder wählen Sie sie im Projekterstellungsbildschirm von Visual Studio (und in der interaktiven dotnet new Benutzeroberfläche) aus. Die nützlichsten Optionen:
--user-audience(External|Internal| ,BothStandardBoth) — wer sich anmeldet. Externe Nutzer erhalten lokale Konten (registrieren, anmelden, Passwort zurücksetzen) sowie alle externen Anbieter, die du aktivierst; Interne Nutzer melden sich nur über Microsoft / Entra an; Beide ermöglichen beides.--include-microsoft-login— fügt "Sign in with Microsoft" hinzu. Standardmäßig aktiviert (und für die interne und beide Zielgruppen erforderlich). Speichere Zugangsdaten unterAuthentication:Microsoft.--include-google-login— fügt Anmeldung mit Google für externe Nutzer hinzu. Bereite OAuth-Zugangsdaten bereit und speichere sie unterAuthentication:Google.--include-facebook-login— fügt für externe Nutzer Continue with Facebook hinzu. Bereite eine App bereit und speichere ihre Zugangsdaten unterAuthentication:Facebook.--include-machine-translation+--machine-translation-provider(Azure|DeepL| )Google— verbindet einen Maschinenübersetzungsanbieter, sodass die Localization Admin-Seite Lokalisierungsdateien übersetzen kann. Wenn es weggelassen wird, bleibt das Übersetzungspanel versteckt und die Registrierung wird als auskommentierte Anleitung verschickt.--include-sample-content(standardmäßig aktiviert) /--empty— Beispielseiten und Styling, die grundlegende Nutzungsmuster demonstrieren, hinzufügen oder weglassen.--interactivity(Server|WebAssembly| )Auto— den Blazor-Rendermodus (siehe oben Interaktivitätsmodi ). Nicht auf die React-Vorlage anwendbar.--use-program-main— eine expliziteProgram.MainMethode anstelle von Top-Level-Anweisungen generieren.--framework(net10.0|net9.0) — das Zielrahmen.
Zum Beispiel ein automatisch gerendertes Blazor-Portal für beide Zielgruppen, mit Google-Anmeldung und Azure-maschineller Übersetzung:
dotnet new powerportalspro -o MyPortal --interactivity Auto --user-audience Both --include-google-login --include-machine-translation --machine-translation-provider Azure
Tipp
Führe
dotnet new powerportalspro -h(oderdotnet new powerportalspro-react -h) aus, um alle Optionen und deren Standardeinstellungen aufzulisten. In Visual Studio erscheinen diese als Kontrollkästchen und Dropdowns auf dem Projekterstellungsbildschirm.
Was enthalten ist
Die Vorlage generiert ein voll funktionsfähiges Portalprojekt mit folgenden Funktionen:
- Beispielseiten — Konto- und Kontaktlistenseiten mit MainGrid sowie Detailseiten mit RecordContext, Editoren und SubGrids.
- Identitätsseiten — Vollständige ASP.NET Kernintegration der Identität mit Seiten Login, Registrieren, Passwort vergessen, Passwort zurücksetzen, Zwei-Faktor-Authentifizierung, E-Mail-Bestätigung und Kontoverwaltung.
- Security Handlers — Vorgefertigte Berechtigungshandler für die Konto- und Kontakttabellen, die Sicherheitsmuster auf Tabellen- und Datensatzebene demonstrieren.
- Layout — Ein MainLayout mit PageLayout, Desktop- und Mobilnavigationsmenüs, Seiteneinstellungen und Themenunterstützung.
- Lokalisierung — Eine JSON-Lokalisierungsdatei (
app.en.json) mit Navigationslabels und seitenspezifischen Strings. - Konfiguration –
appsettings.jsonmit Platzhaltern für Dataverse-Verbindungseinstellungen.
Verständnis Program.cs
Die Program.cs Datei ist der Ort, an dem alle Dienste registriert sind und die Anwendungspipeline konfiguriert ist. Hier ist eine Aufschlüsselung der einzelnen Abschnitte:
React-Template
Der untenstehende Walkthrough beschreibt die
Program.csBlazor-Vorlage . Der Host der React-Vorlage registriert dieselben Kerndienste –AddPowerPortalsProWebServer(), das DataverseConnectionOptions, Lokalisierung, Sicherheitshandler und E-Mail – lässt jedoch die Blazor-spezifischeAddPowerPortalsProWebBlazorFluentUI()Registrierung weg, bedient stattdessen das React SPA und stellt die Authentifizierungsendpunkte überMapAuthEndpoints<PortalUser>()stattMapAdditionalIdentityEndpoints()frei.
Verteilter Cache
Die Vorlage registriert einen speicherbasierten verteilten Cache. In der Produktion sollte man dies durch einen persistenten Cache wie Redis oder SQL Server ersetzen, um die Leistung über mehrere Instanzen hinweg zu verbessern.
builder.Services.AddDistributedMemoryCache();
Fließende UI-Registrierung
AddPowerPortalsProWebBlazorFluentUI() registriert alle Fluent UI Blazor-Komponenten, die von PowerPortalsPro-Editoren, Rastern und Layout-Komponenten verwendet werden.
builder.Services.AddPowerPortalsProWebBlazorFluentUI();
Serverdienste
AddPowerPortalsProWebServer() registriert die zentralen serverseitigen Dienste, einschließlich der Dataverse-Datenzugriffsschicht, Sicherheitsdurchsetzung, Interceptor-Pipeline und Lokalisierungslade.
builder.Services.AddPowerPortalsProWebServer()
Dataverse-Verbindung
Die Konfiguration ConnectionOptions legt fest, wie das Portal sich mit Dataverse authentifiziert. Die Vorlage verwendet die Client Secret-Authentifizierung mit Zugangsdaten, die in appsettings.json oder in Benutzergeheimnissen gespeichert sind.
.Configure<ConnectionOptions>((options) =>
{
options.AuthenticationType = AuthenticationType.ClientSecret;
options.ServiceUri = new Uri(builder.Configuration.GetRequiredValue("D365:Url"));
options.ClientId = builder.Configuration.GetRequiredValue("D365:ClientId");
options.ClientSecret = builder.Configuration.GetRequiredValue("D365:Secret");
})
Tipp
Für Sicherheitsbest-Practices speichern Sie Ihre Zugangsdaten während der Entwicklung in User Secrets und in Azure Key Vault oder Umgebungsvariablen in der Produktion. Geben Sie niemals Geheimnisse zur Quellcodekontrolle heraus.
Lokalisierungskonfiguration
AddLocalizationDirectory registriert Verzeichnisse mit Lokalisierungs-JSON-Dateien. Standardmäßig LocalizeAllAvailableTables ist true, sodass Labels, Spaltennamen und View-Namen automatisch aus jeder Dataverse-Tabelle gezogen werden. Setze es auf false und benutze AddTableToLocalize / AddTablesToLocalize um die Lokalisierung auf eine explizite Liste zu beschränken.
.Configure<LocalizationOptions>(options =>
{
options.AddLocalizationDirectory("localization");
// Standardmäßig ist jede Dataverse-Tabelle lokalisiert. Einschränken
// Lokalisierung in eine explizite Liste, abmelden und die Tabellen hinzufügen:
//options.LocalizeAllAvailableTables = false;
//options.AddTablesToLocalize(new List<string> { "transactioncurrency", "opportunity" });
})
Identitätsoptionen
Der Abschnitt IdentityOptions konfiguriert ASP.NET Core Identity-Einstellungen, wie etwa die E-Mail-Bestätigung vor der Anmeldung.
.Configure<IdentityOptions>(options =>
{
options.SignIn.RequireConfirmedAccount = true;
})
Maschinelle Übersetzung (optional)
Generiere das Projekt mit --IncludeMachineTranslation , um maschinelle Übersetzung für das Panel Translate a File auf der Localization Admin-Seite zu verkabeln. Die Vorlage fügt unten das Paket des gewählten Anbieters PowerPortalsPro.Web.Server.Translation.* und dessen Registrierung hinzu; wählen Sie den Anbieter mit --MachineTranslationProvider: Azure (dem Standard), DeepL, oder Google. Geben Sie den Schlüssel des Anbieters über Konfiguration / Benutzergeheimnisse unter Azure:Translation:Key, DeepL:Translation:Key, oder Google:Translation:Key zum Abgleich bereit.
builder.Services.AddPowerPortalsProAzureTranslationService(options =>
{
options.TranslationKey = builder.Configuration
.GetValue<string>("Azure:Translation:Key") ?? string.Empty;
});
Tipp
Ohne diese Option funktioniert die Localization Admin-Seite weiterhin – die Pipeline-Übersicht und die pro-source/merged Downloads bleiben unbeeinträchtigt; Nur das Übersetzungsfeld bleibt verborgen, und die Registrierung wird als kommentierte Anleitung verschickt, sodass du es später manuell aktivieren kannst.
Registrierung des Sicherheitsbehandlers
Berechtigungshandler werden im DI-Container registriert, um den CRUD-Zugriff für jede Tabelle zu steuern. Die Vorlage enthält Handler für Account (Vollzugriff) und Contact (Schreibgeschützt mit besitzerbasierten Updates).
builder.Services.AddTransient<ITablePermissionHandler, AccountTablePermissionHandler>();
builder.Services.AddTransient<ITableRecordPermissionHandler, ContactTablePermissionHandler>();
builder.Services.AddTransient<ITableRecordPermissionHandler, ExternalLoginPermissionHandler>();
E-Mail-Konfiguration
Sie EmailServiceOptions konfigurieren die Absender-E-Mail-Adresse für Kontobestätigung und Passwort-Zurücksetzung. Dies wird über den Dataverse-E-Mail-Dienst gesendet.
builder.Services.Configure<EmailServiceOptions>(options =>
{
options.EmailSenderEmailAddress = builder.Configuration
.GetRequiredValue("D365:EmailSenderEmailAddress");
});
Microsoft-Authentifizierung (Optional)
Die Vorlage enthält kommentierten Code zum Hinzufügen der Microsoft Entra ID (Azure AD) Authentifizierung. Entkommentieren und konfigurieren Sie Ihre Client-ID und Ihr Geheimnis, um eine externe Anmeldung über Microsoft-Konten zu ermöglichen.
builder.Services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = builder.Configuration
.GetRequiredValue("Authentication:Microsoft:ClientId");
microsoftOptions.ClientSecret = builder.Configuration
.GetRequiredValue("Authentication:Microsoft:ClientSecret");
});
Middleware-Pipeline
UsePowerPortalsProWebServer() fügt die PowerPortalsPro-Middleware hinzu. UseLocalization() ermöglicht das Lokalisierungssystem. MapAdditionalIdentityEndpoints() registriert den cookie-basierten Login-Endpunkt, der von den Identitätsseiten verwendet wird.
app.UsePowerPortalsProWebServer();
app.UseLocalization();
app.MapAdditionalIdentityEndpoints();
Zwei-Faktor-Authentifizierung (optional)
Die Vorlage enthält kommentierten Code zur Ermöglichung der Zwei-Faktor-Authentifizierung mittels e-mailbasierter Codes. Entkommentieren Sie die AuthenticatorTokenProvider Option und den AddDefaultTokenProviders() Anruf zur Aktivierung.
// In Konfigurieren<IdentityOptions>:</IdentityOptions>
options.Tokens.AuthenticatorTokenProvider = TokenOptions.DefaultEmailProvider;
// Nach der Hauptdienstregistrierung:
builder.Services.AddIdentityCore<Contact>()
.AddDefaultTokenProviders();
Häufige Anpassungen
Nachdem Sie das Projekt gerüstet haben, sind hier gängige nächste Schritte:
- Fügen Sie Berechtigungshandler für alle zusätzlichen Dataverse-Tabellen hinzu, auf die Ihr Portal Zugriff hat.
- Jede Dataverse-Tabelle ist standardmäßig lokalisiert. Um einen kleineren Footprint zu vermeiden, setzen
LocalizeAllAvailableTablesSie die gewünschten Tische auffalseund listen Sie sie aufAddTableToLocalize. - Registerimplementierungen
ITableRecordInterceptorfür Geschäftslogik, die vor oder nach Datensatzoperationen läuft. - Aktualisieren Sie die Navigationsmenüs in
NavMenu.razor,DesktopNavMenu.razor, undMobileNavMenu.razorsie entsprechen den Seiten Ihres Portals. - Fügen Sie neue Seiten mit
RecordContext, Editoren und Rastern für Ihre benutzerdefinierten Dataverse-Tabellen hinzu.
