Tutorial: Inserción de un informe de Power BI en una aplicación para su organización
Artículo
Este tutorial explica cómo incrustar un informe de Power BI en una aplicación .NET 5.0, como parte de la solución de incrustación para su organización (también conocida como datos propiedad del usuario). En una solución de inserción para la organización, los usuarios de la aplicación deben autenticarse en Power BI con sus propias credenciales.
En este tutorial, obtendrá información sobre cómo insertar lo siguiente:
Un informe de Power BI
En una aplicación de inserción para la organización
Mediante .NET 5.0
Con la biblioteca Microsoft.Identity.Web (esta biblioteca también se admite en .NET Core)
Nota
La solución completa que se usa en este tutorial está disponible en el repositorio de GitHub DOTNET5-UserOwnsData-Tutorial.
La solución de inserción para la organización no se admite en capacidades basadas en SKU A. Solo se puede usar un SKU A para la solución de inserción para los clientes.
Cuando la aplicación web llama a Power BI, necesita una token de Microsoft Entra llamar a las API REST de Power BI e insertar elementos de Power BI como informes, paneles o iconos.
Busque Registros de aplicaciones y seleccione el vínculo Registros de aplicaciones.
Seleccione la aplicación de Microsoft Entra que usa para insertar el contenido de Power BI.
En Administrar, seleccione Certificados y secretos.
En Secretos de cliente, seleccione Nuevo secreto de cliente.
En la ventana emergente Agregar un secreto de cliente, escriba una descripción del secreto de la aplicación, seleccione cuándo expira el secreto de la aplicación y seleccione Agregar.
En la sección Secretos de cliente, copie la cadena de la columna Valor del secreto de aplicación recién creado. El valor del secreto de cliente es el identificador de cliente.
Nota
Asegúrese de copiar el valor de secreto de cliente cuando aparezca por primera vez. Después de salir de esta página, el secreto de cliente se ocultará y no podrá recuperar su valor.
Id. del área de trabajo
Para obtener el GUID del identificador del área de trabajo, haga lo siguiente:
Inicie sesión en el servicio Power BI.
Abra el informe que quiera insertar.
Copie el GUID de la dirección URL. El GUID es el número que hay entre /groups/ y /reports/ .
Nota
Para obtener el id. del área de trabajo mediante programación, use la API Get Groups.
Report ID (Id. de informe)
Para obtener el GUID del id. del informe, haga lo siguiente:
Inicie sesión en el servicio Power BI.
Abra el informe que quiera insertar.
Copie el GUID de la dirección URL. El GUID es el número que hay entre /reports/ y /ReportSection.
Nota
Para obtener el identificador de informe mediante programación, use la API Get Reports In Group.
Paso 3: Agregar los paquetes NuGet necesarios
Antes de empezar, debe agregar los paquetes NuGet Microsoft.Identity.Web y Microsoft.PowerBI.Api a la aplicación.
Agregue los siguientes paquetes NuGet a la aplicación:
En VS Code, abra un terminal y escriba el código siguiente.
En Visual Studio, vaya a Herramientas>Administrador de paquetes NuGet>Consola del Administrador de paquetes y escriba el código siguiente.
Paso 4: Habilitar la autenticación del lado servidor
Active la autenticación del lado servidor en la aplicación mediante la creación o modificación de los archivos de la tabla siguiente.
Archivo
Uso
Startup.cs
Inicializar el servicio de autenticación Microsoft.Identity.Web
appsettings.json
Detalles de la autenticación
PowerBiServiceApi.cs
Obtener el token de Microsoft Entra y los metadatos de inserción
HomeController.cs
Pasar los datos de inserción como modelo a la vista
Configuración del archivo de inicio para admitir Microsoft.Identity.Web
Modifique el código de Startup.cs para inicializar correctamente el servicio de autenticación que proporciona Microsoft.Identity.Web.
Agregue el código siguiente al archivo Startup.cs de la aplicación.
Nota
El código de ConfigureServices logra varias cosas importantes:
La llamada a AddMicrosoftWebAppCallsWebApi configura la biblioteca de autenticación de Microsoft para adquirir tokens de acceso (tokens de Microsoft Entra).
La llamada a AddInMemoryTokenCaches configura una caché de tokens que la biblioteca de autenticación de Microsoft usará para almacenar en caché los tokens de acceso y actualizar los tokens en segundo plano
La llamada a services.AddScoped(typeof(PowerBiServiceApi)) configura la clase PowerBiServiceApi como una clase de servicio que se puede agregar a otras clases mediante la inserción de dependencias.
using Microsoft.Identity.Web;
using Microsoft.Identity.Web.TokenCacheProviders;
using Microsoft.Identity.Web.TokenCacheProviders.InMemory;
using Microsoft.Identity.Web.UI;
using UserOwnsData.Services;
namespace UserOwnsData {
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(PowerBiServiceApi.RequiredScopes)
.AddInMemoryTokenCaches();
services.AddScoped (typeof (PowerBiServiceApi));
var mvcBuilder = services.AddControllersWithViews (options => {
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add (new AuthorizeFilter (policy));
});
mvcBuilder.AddMicrosoftIdentityUI();
services.AddRazorPages();
}
}
}
Creación de un archivo de detalles de autenticación
En este tutorial, el archivo appsettings.json contiene información confidencial, como el id. de cliente y el secreto del cliente. Por motivos de seguridad, no se recomienda mantener esta información en el archivo de configuración. Al insertar en la aplicación, considere la posibilidad de usar un método más seguro, como Azure Key Vault, para conservar esta información.
En el proyecto, cree un archivo y asígnele el nombre appsettings.json.
En el fragmento de código anterior, el parámetro PowerBi:ServiceRootUrl se agrega como un valor de configuración personalizado para realizar el seguimiento de la dirección URL base al servicio Power BI. Cuando se programa con el servicio Power BI en la nube pública de Microsoft, la dirección URL es https://api.powerbi.com/. Sin embargo, la dirección URL raíz del servicio Power BI será diferente en otras nubes, como la nube gubernamental. Por tanto, este valor se almacena como un valor de configuración del proyecto, por lo que es fácil cambiarlo cuando es necesario.
Obtención del token de acceso de Microsoft Entra y llamada al servicio Power BI
El código de esta sección usa el patrón de inserción de dependencias de .NET Core. Cuando la clase necesita usar un servicio, puede agregar un parámetro de constructor para ese servicio y el entorno de ejecución de .NET Core se encarga de pasar la instancia de servicio en tiempo de ejecución. En este caso, el constructor inserta una instancia del servicio de configuración de .NET Core mediante el parámetro IConfiguration, que se usa para recuperar el valor de configuración PowerBi:ServiceRootUrl de appsettings.json. ElITokenAcquisition parámetro, denominado tokenAcquisition contiene una referencia al servicio de autenticación de Microsoft proporcionado por la biblioteca de Microsoft.Identity.Web y se usa para adquirir tokens de acceso de Microsoft Entra ID.
El campo RequiredScopes contiene una matriz de cadenas que incluye un conjunto de permisos delegados compatible con la API del servicio Power BI. Cuando la aplicación llama a través de la red para adquirir un token de Microsoft Entra, pasa este conjunto de permisos delegados para que Microsoft Entra ID pueda incluirlos en el token de acceso que devuelve.
En el proyecto de la aplicación, cree una carpeta con el nombre Services.
En la carpeta Services, cree un archivo con el nombre PowerBiServiceApi.cs.
Agregue el código siguiente a PowerBiServiceApi.cs.
using Microsoft.Identity.Web;
using Microsoft.PowerBI.Api;
using Microsoft.PowerBI.Api.Models;
using Microsoft.Rest;
using Newtonsoft.Json;
namespace UserOwnsData.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 static readonly string[] RequiredScopes = new string[] {
"https://analysis.windows.net/powerbi/api/Report.Read.All"
};
// A method to get the Azure AD token (also known as 'access token')
public string GetAccessToken() {
return this.tokenAcquisition.GetAccessTokenForUserAsync(RequiredScopes).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 embedding data
var report = await pbiClient.Reports.GetReportInGroupAsync(WorkspaceId, ReportId);
// Return report embedding data to caller
return new EmbeddedReportViewModel {
Id = report.Id.ToString(),
EmbedUrl = report.EmbedUrl,
Name = report.Name,
Token = GetAccessToken()
};
}
}
}
Modificación del archivo HomeController.cs
En este ejemplo de código, se usa la inserción de dependencias. A medida que ha registrado la clase PowerBiServiceApi como servicio mediante una llamada a services.AddScoped en el método ConfigureServices, Puede agregar un parámetro PowerBiServiceApi al constructor y el entorno de ejecución de .NET Core se encargará de crear una instancia PowerBiServiceApi y pasarla al constructor.
En la carpeta Controllers, abra el archivo HomeController.cs y agréguelo al siguiente fragmento de código:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using UserOwnsData.Models;
using UserOwnsData.Services;
namespace UserOwnsData.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() {
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 });
}
}
}
Paso 5: Compilar el lado cliente de la aplicación
Para la implementación en el lado cliente, debe crear o modificar los archivos de la tabla siguiente.
Archivo
Uso
embed.js
Contiene el código JavaScript del lado cliente.
Embed.cshtml
Contiene el modelo de objetos de documento (DOM) de la aplicación y un elemento DIV para insertar el informe.
Creación de un contenedor para el informe insertado
Cree el archivo Embed.cshtml, que tiene un elemento div que se usa como contenedor para el informe insertado y tres scripts.
En la carpeta View>Home, cree un archivo denominado Embed.cshtml.
Agregue el fragmento de código siguiente al archivo Embed.cshtml.
@model UserOwnsData.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.21.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>
}
Incorporación de JavaScript del lado cliente para insertar el informe
Para insertar contenido de Power BI, debe crear un objeto de configuración. Para obtener más información sobre cómo crear el objeto de configuración, vea Inserción de un informe.
En este tutorial, creará un archivo JavaScript denominado embed.js con un objeto de configuración para insertar el informe, mediante la variable models.
models se inicializa mediante una llamada a window['powerbi-client'].models. La variable models se usa para establecer valores de configuración, como models.Permissions.All, models.TokenType.Aad y models.ViewMode.View.
La función powerbi.embed usa el objeto de configuración models para insertar el informe.
En la carpeta wwwroot>js, cree un archivo denominado embed.js.
Agregue el fragmento de código siguiente al archivo embed.js.
$(function(){
// 1 - Get DOM object for div that is report container
let reportContainer = document.getElementById("embed-container");
// 2 - Get report embedding data from view model
let reportId = window.viewModel.reportId;
let embedUrl = window.viewModel.embedUrl;
let token = window.viewModel.token
// 3 - Embed report using the Power BI JavaScript API.
let models = window['powerbi-client'].models;
let config = {
type: 'report',
id: reportId,
embedUrl: embedUrl,
accessToken: token,
permissions: models.Permissions.All,
tokenType: models.TokenType.Aad,
viewMode: models.ViewMode.View,
settings: {
panes: {
filters: { expanded: false, visible: true },
pageNavigation: { visible: false }
}
}
};
// Embed the report and display it within the div container.
let report = powerbi.embed(reportContainer, config);
// 4 - Add logic to resize embed container on window resize event
let heightBuffer = 12;
let newHeight = $(window).height() - ($("header").height() + heightBuffer);
$("#embed-container").height(newHeight);
$(window).resize(function() {
var newHeight = $(window).height() - ($("header").height() + heightBuffer);
$("#embed-container").height(newHeight);
});
});
Paso 6: Ejecutar la aplicación
Una vez que haya realizado todos los ajustes enumerados en este tutorial, estará a punto para ejecutar la aplicación. Ejecute la aplicación y experimente con la forma en que se inserta el informe de Power BI. Puede usar las API de cliente de análisis integrados de Power BI para mejorar la aplicación mediante las API del lado cliente.
El evento definitivo dirigido por la comunidad de Power BI, Fabric, SQL e IA. 31 de marzo - 2 de abril. Use el código MSCUST para obtener un descuento de $ 150. Los precios suben el 11 de febrero.
Con Power BI puede crear informes y objetos visuales atractivos. En este módulo aprenderá a usar Power BI Desktop para conectarse a datos, crear objetos visuales e informes que puede compartir con otras personas de su organización. Después, aprenderá a publicar el informe en el servicio Power BI para que otros usuarios puedan ver sus conclusiones y se beneficien de su trabajo.