Tutorial: Inserir um relatório do Power BI em um aplicativo para seus clientes
Neste tutorial, você aprenderá a inserir um relatório do Power BI em um aplicativo .NET 5.0 como parte da solução inserir para seus clientes (também conhecida como solução aplicativo possui dados). Em uma solução do tipo inserir para seus clientes, os usuários do aplicativo não precisarão entrar no Power BI ou ter uma licença do Power BI.
Neste tutorial, você aprenderá a inserir:
- Um relatório do Power BI.
- Em um aplicativo do tipo inserir para seus clientes.
- Usando uma entidade de serviço.
- Usando o .NET 5.0.
- Com a biblioteca
Microsoft.Identity.Web
(essa biblioteca também tem suporte no .NET Core).
Observação
A solução completa usada neste tutorial está disponível no repositório do GitHub DOTNET5-AppOwnsData-Tutorial.
Pré-requisitos
Uma licença do Power BI Pro ou PPU (Premium por usuário)
Um workspace do Power BI com um relatório
Seu próprio locatário do Microsoft Entra
Um aplicativo MVC (Model-View-Controller) do .NET Core 5
SDK do .NET Core 5 ou superior
Um IDE (ambiente de desenvolvimento integrado). É recomendável um dos seguintes IDEs:
Recursos
Neste tutorial, você usará:
API de Relatórios REST do Power BI, para inserir a URL e recuperar o token de inserção.
APIs de Cliente de análise integrada do Power BI, para inserir o relatório.
Método
Para inserir conteúdo do Power BI em uma solução do tipo inserir para seus clientes, siga estas etapas:
Etapa 1 - Configurar seu aplicativo do Microsoft Entra e a entidade de serviço
Neste tutorial, você usará uma entidade de serviço para autenticar seu aplicativo Web no Microsoft Entra ID. Você também precisa de um aplicativo do Microsoft Entra, que possibilita gerar um token do Microsoft Entra. Usando o token do Microsoft Entra, seu aplicativo Web pode chamar APIs REST do Power BI e inserir itens do Power BI, como relatórios, dashboards e blocos.
Siga as instruções da entidade de serviço para criar um aplicativo do Microsoft Entra e habilitar a entidade de serviço de aplicativos para trabalhar com seu conteúdo do Power BI.
Etapa 2 – Obter os valores do parâmetro de inserção
Para inserir o relatório, você precisará dos seguintes valores:
ID de locatário e domínio
Se não souber qual é sua ID de locatário ou domínio, confira Localizar a ID de locatário e o nome de domínio primário do Microsoft Entra.
Observação
Para inserir conteúdo para um usuário em um locatário diferente (usuário convidado), você precisará ajustar o parâmetro authorityUri
.
ID do Cliente
Para obter o GUID da ID do cliente (também conhecido como ID do aplicativo), siga estas etapas:
Entre no Microsoft Azure.
Pesquise Registros de aplicativo e selecione o link Registros de aplicativo.
Selecione o aplicativo do Microsoft Entra que você está usando para inserir o seu conteúdo do Power BI.
Na seção Visão geral, copie o GUID da ID do aplicativo (cliente) .
Segredo do cliente
Para obter o segredo do cliente, siga estas etapas:
Entre no Microsoft Azure.
Pesquise Registros de aplicativo e selecione o link Registros de aplicativo.
Selecione o aplicativo do Microsoft Entra que você está usando para inserir o seu conteúdo do Power BI.
Em Gerenciar, selecione Certificados e segredos.
Em Segredos do cliente, selecione Novo segredo do cliente.
Na janela pop-up Adicionar um segredo do cliente, forneça uma descrição do segredo do aplicativo, selecione quando o segredo do aplicativo expira e selecione Adicionar.
Na seção Segredos do cliente, copie a cadeia de caracteres na coluna Valor do segredo do aplicativo recém-criado. O valor do segredo do cliente é a sua ID do cliente.
Observação
Copie o valor do segredo do cliente quando aparecer pela primeira vez. Depois de navegar para fora dessa página, o segredo do cliente ficará oculto e você não poderá recuperar seu valor.
ID do workspace
Para obter o GUID da ID do workspace, siga estas etapas:
Entre no serviço do Power BI.
Abra o relatório que deseja inserir.
Copie o GUID da URL. O GUID é o número entre /groups/ e /reports/ .
Observação
Para obter a ID do workspace de maneira programática, use a API Obter Grupos.
ID do Relatório
Para obter o GUID da ID do relatório, siga estas etapas:
Entre no serviço do Power BI.
Abra o relatório que deseja inserir.
Copie o GUID da URL. O GUID é o número entre /reports/ e /ReportSection.
Observação
Para obter a ID do relatório de maneira programática, use a API Obter Relatórios no Grupo.
Etapa 3 – Adicionar os pacotes NuGet necessários
Antes de começar, você precisará adicionar os pacotes NuGet Microsoft.Identity.Web
e Microsoft.PowerBI.Api
ao aplicativo.
Adicione os pacotes NuGet necessários ao aplicativo:
No VS Code, abra um terminal e insira o código a seguir.
No Visual Studio, navegue até Ferramentas>Gerenciador de Pacotes NuGet>Console do Gerenciador de Pacotes e digite o código a seguir.
dotnet add package Microsoft.Identity.Web
dotnet add package Microsoft.Identity.Web.UI
dotnet add package Microsoft.PowerBI.Api
Etapa 4 – Habilitar a autenticação no lado do servidor
Ative a autenticação no lado do servidor no aplicativo criando ou modificando os arquivos na tabela a seguir.
Arquivo | Uso |
---|---|
Startup.cs | Inicializar o serviço de autenticação Microsoft.Identity.Web |
appsettings.json | Configurar os detalhes da autenticação |
PowerBiServiceApi.cs | Obter o token do Microsoft Entra e inserir metadados |
HomeController.cs | Transmitir dados de inserção como um modelo para a exibição |
Configurar o arquivo de inicialização para dar suporte a Microsoft.Identity.Web
Modifique o código em Startup.cs para inicializar corretamente o serviço de autenticação fornecido por Microsoft.Identity.Web
.
Adicione o código a seguir ao arquivo Startup. cs do aplicativo.
Observação
O código em ConfigureServices
realiza várias coisas importantes:
- A chamada para
AddMicrosoftWebAppCallsWebApi
configura a Biblioteca de Autenticação da Microsoft para adquirir tokens de acesso (tokens do Microsoft Entra). - A chamada para
AddInMemoryTokenCaches
configura um cache de token que será usado pela Biblioteca de Autenticação da Microsoft para armazenar em cache os tokens de acesso e atualizar tokens nos bastidores. - A chamada para
services.AddScoped(typeof(PowerBiServiceApi))
configura a classePowerBiServiceApi
como uma classe de serviço que pode ser adicionada a outras classes usando a injeção de dependência.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.UI;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc.Authorization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using AppOwnsData.Services;
namespace AppOwnsData
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
services.AddMicrosoftIdentityWebAppAuthentication(Configuration)
.EnableTokenAcquisitionToCallDownstreamApi()
.AddInMemoryTokenCaches();
services.AddScoped(typeof(PowerBiServiceApi));
services.AddControllersWithViews(options => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
services.AddRazorPages()
.AddMicrosoftIdentityUI();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
// The default HSTS value is 30 days. You might want to change this for production scenarios. See https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
endpoints.MapRazorPages();
});
}
}
}
Criar um arquivo de detalhes de autenticação
Neste tutorial, o arquivo appsettings.json contém informações confidenciais, como a ID do cliente e o segredo do cliente. Por motivos de segurança, não recomendamos manter essas informações no arquivo de configurações. Ao inserir no aplicativo, considere uma ferramenta mais segura, como o Azure Key Vault, para proteger informações confidenciais.
No projeto, crie um arquivo e dê a ele o nome appsettings.json.
Adicione o seguinte código a appsettings.json:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "yourtenant.onMicrosoft.com", "TenantId": "", "ClientId": "", "ClientSecret": "", "CallbackPath": "/signin-oidc", "SignedOutCallbackPath": "/signout-callback-oidc" }, "PowerBi": { "ServiceRootUrl": "https://api.powerbi.com/" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*" }
Preencha os valores do parâmetro de inserção obtidos na Etapa 2 – Obter os valores do parâmetro de inserção.
Domain
- ID de locatário e domínioTenantId
- ID de locatário e domínioClientId
- ID do clienteClientSecret
- Segredo do cliente
Observação
No código anterior, o parâmetro PowerBi:ServiceRootUrl
é adicionado como um valor de configuração personalizado para rastrear a URL base para o serviço do Power BI. Quando você programa em um serviço do Power BI na nuvem pública da Microsoft, a URL é https://api.powerbi.com/
. No entanto, a URL raiz para o serviço do Power BI é diferente em outras nuvens, como a nuvem governamental. Portanto, o valor de configuração personalizado é armazenado como um valor de configuração do projeto para que você possa alterá-lo conforme necessário.
Obter o token de acesso do Microsoft Entra e chamar o serviço do Power BI
Para inserir conteúdo do Power BI como relatórios e dashboards, seu aplicativo precisa obter um token do Azure AD. Para obter o token, você precisará de um objeto de configuração.
O código nesta seção usa o padrão de injeção de dependência do .NET Core. Quando sua classe precisar usar um serviço, você poderá adicionar um parâmetro de construtor para o serviço. O runtime do .NET Core cuida da passagem da instância de serviço em tempo de execução. Nesse caso, o construtor injeta uma instância do serviço de configuração do .NET Core usando o parâmetro IConfiguration
, que é usado para recuperar o valor de configuração PowerBi:ServiceRootUrl
de appsettings.json. O parâmetro ITokenAcquisition
, que se chama tokenAcquisition
, contém uma referência ao serviço de autenticação da Microsoft fornecido pela biblioteca Microsoft.Identity.Web
. O parâmetro ITokenAcquisition
é usado para adquirir tokens de acesso do Microsoft Entra ID.
O campo RequiredScopes
contém uma matriz de cadeia de caracteres que contém um conjunto de permissões delegadas com suporte da API de serviço do Power BI. Quando o aplicativo chamar pela rede para adquirir um token do Azure AD, ele passará esse conjunto de permissões delegadas para que o Azure AD possa incluí-las no token de acesso retornado.
Observação
Verifique se o aplicativo do Microsoft Entra está configurado com os escopos exigidos pelo aplicativo Web. Para obter mais informações, confira Alterar as permissões de aplicativo do Microsoft Entra.
No projeto do aplicativo, crie uma pasta chamada Services.
Na pasta Services, crie um arquivo intitulado PowerBiServiceApi.cs.
Adicione o código a seguir a PowerBiServiceApi.cs.
using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.Configuration; using Microsoft.Identity.Web; using Microsoft.Rest; using Microsoft.PowerBI.Api; using Microsoft.PowerBI.Api.Models; using Newtonsoft.Json; namespace AppOwnsData.Services { // A view model class to pass the data needed to embed a single report public class EmbeddedReportViewModel { public string Id; public string Name; public string EmbedUrl; public string Token; } public class PowerBiServiceApi { private ITokenAcquisition tokenAcquisition { get; } private string urlPowerBiServiceApiRoot { get; } public PowerBiServiceApi(IConfiguration configuration, ITokenAcquisition tokenAcquisition) { this.urlPowerBiServiceApiRoot = configuration["PowerBi:ServiceRootUrl"]; this.tokenAcquisition = tokenAcquisition; } public const string powerbiApiDefaultScope = "https://analysis.windows.net/powerbi/api/.default"; // A method to get the Azure AD token (also known as 'access token') public string GetAccessToken() { return this.tokenAcquisition.GetAccessTokenForAppAsync(powerbiApiDefaultScope).Result; } public PowerBIClient GetPowerBiClient() { var tokenCredentials = new TokenCredentials(GetAccessToken(), "Bearer"); return new PowerBIClient(new Uri(urlPowerBiServiceApiRoot), tokenCredentials); } public async Task<EmbeddedReportViewModel> GetReport(Guid WorkspaceId, Guid ReportId) { PowerBIClient pbiClient = GetPowerBiClient(); // Call the Power BI service API to get the embedding data. var report = await pbiClient.Reports.GetReportInGroupAsync(WorkspaceId, ReportId); // Generate a read-only embed token for the report. var datasetId = report.DatasetId; var tokenRequest = new GenerateTokenRequest(TokenAccessLevel.View, datasetId); var embedTokenResponse = await pbiClient.Reports.GenerateTokenAsync(WorkspaceId, ReportId, tokenRequest); var embedToken = embedTokenResponse.Token; // Return the report embedded data to caller. return new EmbeddedReportViewModel { Id = report.Id.ToString(), EmbedUrl = report.EmbedUrl, Name = report.Name, Token = embedToken }; } } }
Modificar o arquivo HomeController.cs
Neste exemplo de código, você usa a injeção de dependência para modificar o arquivo HomeController.cs. Seguindo uma etapa anterior, você configurou a PowerBiServiceApi
classe como um serviço chamando services.AddScoped
no método ConfigureServices
. Com esse código, você adiciona um parâmetro PowerBiServiceApi
ao construtor e o runtime do .NET Core cria uma instância PowerBiServiceApi
e a passa para o construtor.
Na pasta Controladores, abra o arquivo HomeController.cs e adicione a ele o seguinte código:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using AppOwnsData.Models;
using AppOwnsData.Services;
namespace AppOwnsData.Controllers
{
[Authorize]
public class HomeController : Controller
{
private PowerBiServiceApi powerBiServiceApi;
public HomeController(PowerBiServiceApi powerBiServiceApi)
{
this.powerBiServiceApi = powerBiServiceApi;
}
[AllowAnonymous]
public IActionResult Index()
{
return View();
}
public async Task<IActionResult> Embed() {
// Replace these two GUIDs with the workspace ID and report ID you recorded earlier.
Guid workspaceId = new Guid("11111111-1111-1111-1111-111111111111");
Guid reportId = new Guid("22222222-2222-2222-2222-222222222222");
var viewModel = await powerBiServiceApi.GetReport(workspaceId, reportId);
return View(viewModel);
}
[AllowAnonymous]
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
public IActionResult Error()
{
return View(new ErrorViewModel { RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier });
}
}
}
Etapa 5 – Criar o lado do cliente do aplicativo
Para a implementação do lado do cliente, você precisará criar ou modificar os arquivos listados na seguinte tabela:
Arquivo | Uso |
---|---|
embed.js | Contém o código JavaScript do lado do cliente |
Embed.cshtml | Contém o DOM (modelo de objeto do documento) do aplicativo e um DIV para inserir o relatório |
Criar um contêiner para o relatório inserido
Neste tutorial, você cria o arquivo Embed.cshtml, que tem um elemento div
que é um contêiner para o relatório inserido e três scripts.
Na pasta View/Home, crie um arquivo chamado Embed.cshtml.
Adicione o código a seguir ao arquivo Embed.cshtml.
@model AppOwnsData.Services.EmbeddedReportViewModel; <div id="embed-container" style="height:800px;"></div> @section Scripts { <!-- powerbi.min.js is the JavaScript file that loads the client-side Power BI JavaScript API library. Make sure that you're working with the latest library version. You can check the latest library available in https://cdnjs.com/libraries/powerbi-client --> <script src="https://cdn.jsdelivr.net/npm/powerbi-client@2.18.0/dist/powerbi.min.js"></script> <!-- This script creates a JavaScript object named viewModel which is accessible to the JavaScript code in embed.js. --> <script> var viewModel = { reportId: "@Model.Id", embedUrl: "@Model.EmbedUrl", token: "@Model.Token" }; </script> <!-- This script specifies the location of the embed.js file --> <script src="~/js/embed.js"></script> }
Adicionar JavaScript do lado do cliente para inserir o relatório
Para inserir conteúdo do Power BI, você precisa criar um objeto de configuração. Para saber mais sobre como criar o objeto de configuração, confira Inserir um relatório.
Neste tutorial, você criará um arquivo JavaScript chamado embed.js com um objeto de configuração para inserir o relatório usando a variável models
.
Você pode inicializar models
usando uma chamada para window['powerbi-client'].models
. A variável models
é usada para definir valores de configuração como models.Permissions.All
, models.TokenType.Aad
e models.ViewMode.View
.
A função powerbi.embed
usa o objeto de configuração models
para inserir o relatório.
Na pasta wwwroot/js, crie um arquivo chamado embed.js.
Adicione o código a seguir ao arquivo embed.js.
$(function () { // 1 - Get DOM object for the div that's the report container. var reportContainer = document.getElementById("embed-container"); // 2 - Get the report embedding data from the view model. var reportId = window.viewModel.reportId; var embedUrl = window.viewModel.embedUrl; var token = window.viewModel.token // 3 - Embed the report by using the Power BI JavaScript API. var models = window['powerbi-client'].models; var config = { type: 'report', id: reportId, embedUrl: embedUrl, accessToken: token, permissions: models.Permissions.All, tokenType: models.TokenType.Embed, viewMode: models.ViewMode.View, settings: { panes: { filters: { expanded: false, visible: true }, pageNavigation: { visible: false } } } }; // Embed the report and display it within the div container. var report = powerbi.embed(reportContainer, config); // 4 - Add logic to resize the embed container on a window resize event. var heightBuffer = 12; var newHeight = $(window).height() - ($("header").height() + heightBuffer); $("#embed-container").height(newHeight); $(window).resize(function () { var newHeight = $(window).height() - ($("header").height() + heightBuffer); $("#embed-container").height(newHeight); }); });
Etapa 6 – Executar o aplicativo
Depois de seguir todas as etapas anteriores, você estará pronto para executar o aplicativo. Tente executar o aplicativo e experimente com a maneira como o relatório do Power BI é inserido. Use as APIs de Cliente de análise integrada do Power BI para aprimorar o aplicativo usando APIs do lado do cliente.
Importante
Se você usou tokens de avaliação de inserção gratuitos para desenvolvimento, precisará comprar uma capacidade para produção. Até que uma capacidade seja adquirida, a faixa de versão de avaliação gratuita continuará a aparecer na parte superior do relatório inserido.
Quando o aplicativo estiver pronto, você poderá mover o aplicativo inserido para produção.