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.
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:Secret");
})
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 registram diretórios contendo arquivos JSON de localização. Por padrão LocalizeAllAvailableTables é true, então rótulos, nomes de colunas e nomes de visualização são retirados automaticamente de todas as tabelas do Dataverse. Defina para false e use AddTableToLocalize / AddTablesToLocalize para restringir a localização a uma lista explícita.
.Configure<LocalizationOptions>(options =>
{
options.AddLocalizationDirectory("localization");
// Por padrão, toda tabela do Dataverse é localizada. Restrição
// Localização para uma lista explícita, opte por não incluir e adicione as tabelas:
//options.LocalizeAllAvailableTables = false;
//options.AddTablesToLocalize(new List<string> { "transactioncurrency", "opportunity" });
})
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;
})
components.PowerPortalsPro.Demo.Client.Customizations.Pages.GettingStarted.ProjectTemplatesPage.program-translation-title
components.PowerPortalsPro.Demo.Client.Customizations.Pages.GettingStarted.ProjectTemplatesPage.program-translation-description
builder.Services.AddPowerPortalsProAzureTranslationService(options =>
{
options.TranslationKey = builder.Configuration
.GetValue<string>("Azure:Translation:Key") ?? string.Empty;
});
Dica
components.PowerPortalsPro.Demo.Client.Customizations.Pages.GettingStarted.ProjectTemplatesPage.program-translation-note
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.AddTransient<ITablePermissionHandler, AccountTablePermissionHandler>();
builder.Services.AddTransient<ITableRecordPermissionHandler, ContactTablePermissionHandler>();
builder.Services.AddTransient<ITableRecordPermissionHandler, ExternalLoginPermissionHandler>();
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:</IdentityOptions>
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.
- Toda tabela do Dataverse é localizada por padrão. Para optar por não usar uma área menor, defina
LocalizeAllAvailableTablesefalseliste as tabelas que deseja viaAddTableToLocalize. - 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.
