Modelos de Projeto
O PowerPortalsPro traz dois modelos de projeto que estruturam um portal completo — conectividade, autenticação, manipuladores de segurança, localização e páginas de identidade pré-construídas — prontos para rodar em minutos. Um aplicativo React de página única (recomendado) e um aplicativo web Blazor estão ambos disponíveis, e o conjunto de recursos PowerPortalsPro é idêntico em ambos. Escolha a stack de front-end que se encaixe no seu time.
Instalação dos Templates
Instale o pacote PowerPortalsPro.AspNetCore.Templates do NuGet usando a CLI .NET. Ambos os templates vêm neste único pacote:
dotnet new install PowerPortalsPro.AspNetCore.Templates
Escolhendo um Modelo
Uma vez instalado, crie um projeto a partir da CLI .NET ou do diálogo "Novo Projeto" do Visual Studio (procure por "Power Portals Pro"). Dois modelos estão disponíveis — escolha aquele que combina com sua pilha front-end:
React (recomendado)
Um host ASP.NET Core combinado com um aplicativo de página única React + Vite + TypeScript construído no Fluent UI React. Recomendado para novos portais — ferramentas modernas de front-end, um ciclo de desenvolvimento rápido com recarga a quente e o conjunto de componentes mais amplo.
dotnet new powerportalspro-react -o MyPortal
Blazor
Um aplicativo web ASP.NET Core Blazor construído sobre o Fluent UI Blazor, com um modo de renderização que você escolhe no momento do andaime via --interactivity. É um ótimo encaixe quando sua equipe trabalha principalmente em C# e prefere ficar totalmente na pilha de interface do .NET.
dotnet new powerportalspro -o MyPortal --interactivity Auto
Recomendado
Ambos os templates expõem as mesmas capacidades do PowerPortalsPro — grades, editores, segurança, localização e identidade. Sugerimos o React para novos projetos, a menos que sua equipe tenha um motivo específico para permanecer totalmente em C#, caso em que o template do Blazor é totalmente suportado.
O Modelo React
O powerportalspro-react template gera dois projetos que rodam juntos:
- ASP.NET Host Core — atende os dados e endpoints de autenticação do framework sob
/api/*e hospeda o SPA construído. EleProgram.csé configurado de forma semelhante ao host Blazor (conexão Dataverse, localização, handlers de segurança) e expõe os endpoints de autenticação JSON viaMapAuthEndpoints<PortalUser>(). - Cliente React (
.Client) — um SPA Vite + TypeScript construído sobre o Fluent UI React, que consume os@powerportalspro/corepacotes ,@powerportalspro/react,@powerportalspro/react-fluent, e@powerportalspro/react-chartspacotes para a camada de transporte, ganchos e componentes. - Dev loop — pressione F5 (ou execute
dotnet run) no host e o SpaProxy inicia o servidor de desenvolvimento Vite para você, com recarregamento do módulo quente nas edições do cliente. Não é necessário um terminal separado. - Mesma superfície do Blazor — páginas de exemplos de Contas/Contatos, páginas de identidade e gerenciamento de contas, manipuladores de permissões de tabelas, navegação e configurações de tema/site, tudo reconstruído com componentes React.
Modos de Interatividade Blazor
O template Blazor também aceita --interactivity Server, --interactivity WebAssembly, ou --interactivity Auto escolher seu modo de renderização (o template React é sempre um aplicativo de página única, então não tem opção equivalente). Escolher um modo logo de cara só afeta o layout do projeto gerado — o próprio PowerPortalsPro roda corretamente nos três. Veja a página Blazor Interactivity para uma comparação completa.
- Servidor — páginas interativas executadas no servidor por meio de uma conexão SignalR. A implantação mais simples e o menor download do cliente. Bom padrão quando você está em dúvida.
- WebAssembly — páginas interativas executadas no navegador como código compilado .NET. Estrutura um projeto separado
.Client; o servidor hospeda os endpoints da API consumidos pelo cliente. Ideal para UX rico do lado do cliente e trabalho de interação descarregado do servidor. - Auto — renderiza a primeira pintura no servidor para uma carga rápida e percebida, depois transfere para o WebAssembly de forma transparente assim que o pacote cliente é baixado. Combina o melhor dos dois, mas ao custo de um layout de projeto um pouco mais complexo.
Dica
A
--interactivitybandeira corresponde à bandeira do template padrãodotnet new blazorcom o mesmo nome, então tudo que você já sabe sobre os modos de renderização do Blazor é mantido.
Opções de Modelo
Ambos os templates expõem dotnet new opções para que você possa personalizar o projeto gerado desde o início. Passe-os na linha de comando ou escolha na tela de criação de projetos do Visual Studio (e na dotnet new interface interativa). As opções mais úteis:
--UserAudience(External|Internal|Both, padrãoBoth) — quem faz login. Usuários externos recebem contas locais (registro, login, redefinição de senha) além de quaisquer provedores externos que você habilite; Usuários internos entram apenas pela Microsoft / Entra; Ambos ativam cada um.--IncludeMicrosoftLogin— adiciona Login com a Microsoft. Ativado por padrão (e obrigatório para os públicos Interno e Ambos). Armazene credenciais emAuthentication:Microsoft.--IncludeGoogleLogin— adiciona Login com o Google para usuários externos. Provisionar credenciais OAuth e armazená-las emAuthentication:Google.--IncludeFacebookLogin— acrescenta Continue com o Facebook para usuários externos. Provisione um aplicativo e armazene suas credenciais emAuthentication:Facebook.--EnableEnhancedAuthorization(desligado por padrão) — opta pelo modelo de segurança nativo do Dataverse no lugar do padrão, onde os usuários do portal são contatos e o acesso é declarado emProgram.cs: cada usuário do portal é respaldado por um usuário do Dataverse gerenciado pelo sistema, e o acesso é regido pelos papéis de segurança que o Power Pages sincroniza a partir dos papéis web e permissões de tabela do site. O ambiente precisa dos componentes do framework Power Pages e do recurso unificado de segurança do Dataverse — criando um site Power Pages após a instalação. Veja Segurança do Dataverse.--WebsiteId— o id do registro do site Power Pages (powerpagesite) contra o qual os mapeamentos de usuário do portal são criados; encontre-o em<your org url>/api/data/v9.2/powerpagesites. Usado apenas quando a autorização aprimorada está ativada, onde é carimbado comoProgram.csoptions.DataverseSecurity.PowerPagesSiteId. Pule e a inicialização falha com orientação até que você preencha ali.--IncludeMachineTranslation+--MachineTranslationProvider(Azure|DeepL|Google) — conecta um provedor de tradução automática para que a página de Administrador de Localização possa traduzir arquivos de localização. Quando omitido, o painel de tradução permanece oculto e o registro é enviado conforme orientação comentada.--empty(ou-e) — omitem as páginas de exemplo e o estilo que demonstrem padrões básicos de uso. Conteúdo de exemplo está incluído, a menos que você passe por isso.--interactivity(Server|WebAssembly|Auto) — o modo de renderização Blazor (veja Modos de Interatividade acima). Não aplicável ao template React.--all-interactive— Apenas Blazor. Aplica o modo de renderização interativa no nível superior para que todas as páginas sejam interativas. Desligado por padrão, o que deixa as páginas estaticamente renderizadas no servidor até você mesmo optar por uma em uma.--use-program-main— gerar um método explícitoProgram.Mainem vez de instruções de nível superior.--framework(net10.0|net9.0) — o arcabou-alvo.--no-https— herdados dos templates padrão ASP.NET Core, e isso não tem efeito aqui: todo público de usuários faz login, o login requer HTTPS, então o perfil de lançamento gerado mantém isso de qualquer forma. Listado porquedotnet new -hainda mostra isso.
Por exemplo, um portal Blazor auto-renderizado para ambos os públicos, com login do Google e tradução automática do Azure:
dotnet new powerportalspro -o MyPortal --interactivity Auto --UserAudience Both --IncludeGoogleLogin --IncludeMachineTranslation --MachineTranslationProvider Azure
Dica
Execute
dotnet new powerportalspro -h(oudotnet new powerportalspro-react -h) para listar todas as opções e seu padrão. No Visual Studio, eles aparecem como caixas de seleção e menu suspenso na tela de criação de projetos.
O que está incluído
O modelo gera um projeto de portal totalmente funcional com o seguinte:
- Páginas de Exemplo — Páginas de listas de Contas e Contatos com MainGrid, além de páginas de detalhes com RecordContext, editores e SubGrids.
- Páginas de Identidade — Complete integração ASP.NET Core Identity com páginas de login, registro, esqueci senha, redefinição de senha, autenticação em dois fatores, confirmação de e-mail e gerenciamento de conta.
- Manipuladores de Segurança — Manipuladores de permissões pré-construídos para as tabelas de Conta e Contato, demonstrando padrões de segurança em nível de tabela e registro.
- Layout — Um MainLayout com PageLayout, menus de navegação para desktop e celular, configurações do site e suporte a temas.
- Localização — Um arquivo de localização JSON (
app.en.json) com rótulos de navegação e strings específicas de página. - Configuração —
appsettings.jsoncom marcadores para as configurações de conexão Dataverse.
Entendendo Program.cs
O Program.cs arquivo é onde todos os serviços são registrados e o pipeline de aplicação é configurado. Aqui está uma divisão de cada seção:
Modelo React
O guia abaixo descreve o modelo
Program.csBlazor . O host do template React registra os mesmos serviços centrais —AddPowerPortalsProWebServer(), o DataverseConnectionOptions, localização, manipuladores de segurança e e-mail — mas omite o registro específicoAddPowerPortalsProWebBlazorFluentUI()do Blazor, serve o React SPA e expõe os endpoints de autenticação viaMapAuthEndpoints<PortalUser>()em vez deMapAdditionalIdentityEndpoints().
Cache distribuído
O template registra um cache distribuído baseado em memória. Em produção, substitua isso por um cache persistente como Redis ou SQL Server para melhor desempenho em múltiplas instâncias.
builder.Services.AddDistributedMemoryCache();
Registro Fluent UI
AddPowerPortalsProWebBlazorFluentUI() registra todos os componentes do Fluent UI Blazor usados pelos editores, grids e componentes de layout do PowerPortalsPro.
builder.Services.AddPowerPortalsProWebBlazorFluentUI();
Serviços de servidor
AddPowerPortalsProWebServer() registra os serviços principais do lado do servidor, incluindo a camada de acesso a dados do Dataverse, aplicação de segurança, pipeline de interceptores e carregamento de localização.
builder.Services.AddPowerPortalsProWebServer()
Conexão Dataverse
A ConnectionOptions configuração especifica como o portal se autentica com o Dataverse. O modelo utiliza autenticação por Segredo do Cliente com credenciais armazenadas em appsettings.json ou Segredos de Usuário.
.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:ClientSecret");
})
Dica
Para melhores práticas de segurança, armazene suas credenciais em Segredos de Usuário durante o desenvolvimento e no Azure Key Vault ou variáveis de ambiente em produção. Nunca comprometa segredos com o controle de versão.
Configuração de Localização
AddLocalizationDirectory registra diretórios contendo arquivos JSON de localização. AddTablesToLocalize(Tables.CoreTables) extrai rótulos, nomes de colunas e nomes de visualização das tabelas Dataverse mais usadas. Adicione suas próprias tabelas com AddTablesToLocalizeByPublisherPrefix ou AddTableToLocalize.
.Configure<LocalizationOptions>(options =>
{
options.AddLocalizationDirectory("localization");
// Localize as tabelas Dataverse mais usadas. Power Portals Pro
// mesas próprias estão sempre incluídas.
options.AddTablesToLocalize(Tables.CoreTables);
// Adicione suas próprias tabelas pelo prefixo do editor deles:
//options.AddTablesToLocalizeByPublisherPrefix("new_");
})
Opções de Identidade
A IdentityOptions seção configura ASP.NET configurações de Identidade Central, como exigir confirmação por e-mail antes do login.
.Configure<IdentityOptions>(options =>
{
options.SignIn.RequireConfirmedAccount = true;
})
Tradução Automática (opcional)
Gerar o projeto para --IncludeMachineTranslation conectar a tradução automática para o painel de arquivos Translate na página de Administração de Localização. O modelo adiciona abaixo o pacote do PowerPortalsPro.Web.Server.Translation.* provedor escolhido e seu registro; escolha o provedor com --MachineTranslationProvider: Azure (o padrão), DeepL, ou Google. Forneça a chave do provedor via configuração / secretos de usuário sob Azure:Translation:Key, DeepL:Translation:Key, ou Google:Translation:Key para corresponder.
builder.Services.AddPowerPortalsProAzureTranslationService(options =>
{
options.TranslationKey = builder.Configuration
.GetValue<string>("Azure:Translation:Key") ?? string.Empty;
});
Dica
Sem essa opção, a página de Administrador de Localização ainda funciona — a visão geral do pipeline e os downloads por fonte/mesclados não são afetados; Apenas o painel de tradução permanece oculto, e o registro é enviado conforme as orientações comentadas para que você possa ativar manualmente depois.
Registro de Manipuladores de Segurança
Os manipuladores de permissão são registrados no contêiner DI para controlar o acesso CRUD para cada tabela. O modelo inclui handlers para Conta (acesso total) e Contato (somente leitura com atualizações baseadas no proprietário).
builder.Services.AddTablePermissionProvider<AccountTablePermissionProvider>();
builder.Services.AddTablePermissionProvider<ContactTablePermissionProvider>();
builder.Services.AddTablePermissionProvider<ExternalLoginPermissionProvider>();
Configuração do E-mail
Ele EmailServiceOptions configura o endereço de e-mail do remetente usado para confirmação de conta e redefinição de senha. Isso é enviado pelo serviço de e-mail Dataverse.
builder.Services.Configure<EmailServiceOptions>(options =>
{
options.EmailSenderEmailAddress = builder.Configuration
.GetRequiredValue("D365:EmailSenderEmailAddress");
});
Autenticação Microsoft (Opcional)
O modelo inclui código comentado para adicionar autenticação Microsoft Entra ID (Azure AD). Descomente e configure seu ID de Cliente e seu Segredo para habilitar login externo via contas Microsoft.
builder.Services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
microsoftOptions.ClientId = builder.Configuration
.GetRequiredValue("Authentication:Microsoft:ClientId");
microsoftOptions.ClientSecret = builder.Configuration
.GetRequiredValue("Authentication:Microsoft:ClientSecret");
});
Middleware Pipeline
UsePowerPortalsProWebServer() adiciona o middleware PowerPortalsPro. UseLocalization() Habilita o sistema de localização. MapAdditionalIdentityEndpoints() registra o endpoint de login baseado em cookies usado pelas páginas de identidade.
app.UsePowerPortalsProWebServer();
app.UseLocalization();
app.MapAdditionalIdentityEndpoints();
Autenticação em Dois Fatores (Opcional)
O modelo inclui código comentado para habilitar a Autenticação de Dois Fatores usando códigos baseados em e-mail. Descomente a AuthenticatorTokenProvider opção e a AddDefaultTokenProviders() chamada para ativá-la.
// No <IdentityOptions>Configure:
options.Tokens.AuthenticatorTokenProvider = TokenOptions.DefaultEmailProvider;
// Após o registro principal do serviço:
builder.Services.AddIdentityCore<Contact>()
.AddDefaultTokenProviders();
Customizações Comuns
Após a estrutura do projeto, aqui estão os próximos passos comuns:
- Adicione handlers de permissões para quaisquer tabelas adicionais do Dataverse acessadas pelo seu portal.
- Adicione suas próprias tabelas à localização com
AddTablesToLocalizeByPublisherPrefixouAddTableToLocalize. O template localizaTables.CoreTables, que cobre as tabelas Dataverse comumente usadas. - Registrar
ITableRecordInterceptorimplementações para lógica de negócios que rodem antes ou depois das operações de registro. - Atualize os menus de navegação em
NavMenu.razor,DesktopNavMenu.razor, eMobileNavMenu.razorpara corresponder às páginas do seu portal. - Adicione novas páginas com
RecordContext, editores e grades para suas tabelas personalizadas do Dataverse.
