Självstudie: Bädda in en Power BI-rapport i ett program för din organisation
I den här självstudien beskrivs hur du bäddar in en Power BI-rapport i ett .NET 5.0-program som en del av inbäddningen för din organisation (även kallat användar äger data). I en inbäddning för din organisationslösning måste appanvändare autentisera mot Power BI med sina egna autentiseringsuppgifter.
I den här självstudien lär du dig att bädda in:
- En Power BI-rapport
- I en inbäddning för din organisationsapp
- Använda .NET 5.0
Microsoft.Identity.Web
Med biblioteket (det här biblioteket stöds också i .NET Core)
Kommentar
Den fullständiga lösningen som används i den här självstudien är tillgänglig från github-lagringsplatsen DOTNET5-UserOwnsData-Tutorial .
Förutsättningar
En licens för Power BI Pro eller Premium per användare (PPU).
Kommentar
Inbäddningen för din organisationslösning stöds inte på kapaciteter som baseras på A-SKU :er. En SKU kan bara användas för inbäddning för dina kunders lösning.
En Power BI-arbetsyta med en rapport.
Din egen Microsoft Entra-klientorganisation.
En MVC-app (.NET Core 5 model view controller).
.NET Core 5 SDK (eller senare).
En integrerad utvecklingsmiljö (IDE). Vi rekommenderar att du använder någon av följande miljöer:
Resurser
I den här självstudien använder du:
- Power BI REST Reports API – för att bädda in URL:en och hämta inbäddningstoken.
- Microsoft Identity Web Authentication-bibliotek.
- Klient-API:er för Power BI Embedded-analys – för att bädda in rapporten.
Metod
Följ dessa steg om du vill bädda in Power BI-innehåll i en inbäddning för din organisationslösning :
- Konfigurera din Microsoft Entra-app
- Hämta parametervärdena för inbäddning
- Lägg till nödvändiga NuGet-paket
- Aktivera autentisering på serversidan
- Skapa appens klientsida
- Kör ditt program
Steg 1 – Konfigurera din Microsoft Entra-app
När din webbapp anropar Power BI behöver den en Microsoft Entra-token för att anropa Power BI REST-API:er och bädda in Power BI-objekt som rapporter, instrumentpaneler eller paneler.
Om du inte har någon Microsoft Entra-app skapar du en med hjälp av anvisningarna i Registrera ett Microsoft Entra-program som ska användas med Power BI.
Om du vill konfigurera din Microsoft Entra-app följer du anvisningarna i Konfigurera din Microsoft Entra-app.
Steg 2 – Hämta parametervärdena för inbäddning
För att bädda in rapporten behöver du följande värden:
Domän- och klientorganisations-ID
Om du inte känner till din domän eller ditt klient-ID kan du läsa Hitta Klient-ID för Microsoft Entra och det primära domännamnet.
Kommentar
Om du vill bädda in innehåll för en användare i en annan klientorganisation (en gästanvändare) måste du justera parametern authorityUri
.
Client ID
Följ dessa steg för att hämta klient-ID:ts GUID (även kallat program-ID):
Logga in på Microsoft Azure.
Sök efter Appregistreringar och välj länken Appregistreringar.
Välj den Microsoft Entra-app som du använder för att bädda in ditt Power BI-innehåll.
I avsnittet Översikt kopierar du program-ID:t (klient-ID :t).
Klienthemlighet
Följ dessa steg för att hämta klienthemligheten:
Logga in på Microsoft Azure.
Sök efter Appregistreringar och välj länken Appregistreringar.
Välj den Microsoft Entra-app som du använder för att bädda in ditt Power BI-innehåll.
Under Hantera väljer du Certifikat och hemligheter.
Under Klienthemligheter väljer du Ny klienthemlighet.
I popup-fönstret Lägg till en klienthemlighet anger du en beskrivning av programhemligheten, väljer när programhemligheten upphör att gälla och väljer Lägg till.
I avsnittet Klienthemligheter kopierar du strängen i kolumnen Värde i den nyligen skapade programhemligheten. Värdet för klienthemligheten är ditt klient-ID.
Kommentar
Se till att du kopierar värdet för klienthemligheten när det först visas. När du har navigerat bort från den här sidan döljs klienthemligheten och du kan inte hämta dess värde.
Arbetsplats-ID
Följ dessa steg för att hämta arbetsyte-ID:ts GUID:
Logga in på Power BI-tjänst.
Öppna den rapport som du vill bädda in.
Kopiera GUID från URL:en. GUID är talet mellan /groups/ och /reports/.
Kommentar
Om du vill hämta arbetsytans ID programmatiskt använder du API:et Hämta grupper .
Rapport-ID
Följ dessa steg för att hämta rapport-ID:ts GUID:
Logga in på Power BI-tjänst.
Öppna den rapport som du vill bädda in.
Kopiera GUID från URL:en. GUID är talet mellan /reports/ och /ReportSection.
Kommentar
Om du vill hämta rapport-ID:t programmatiskt använder du API:et Hämta rapporter i grupp .
Steg 3 – Lägg till nödvändiga NuGet-paket
Innan du börjar måste du lägga till , och Microsoft.PowerBI.Api
NuGet-paketen Microsoft.Identity.Web
i din app.
Lägg till följande NuGet-paket i din app:
I VS Code öppnar du en terminal och skriver in följande kod.
I Visual Studio går du till Verktyg>NuGet Package Manager Package Manager-konsolen> och skriver in följande kod.
dotnet add package Microsoft.Identity.Web -v 0.3.0-preview
dotnet add package Microsoft.Identity.Web.UI -v 0.3.0-preview
dotnet add package Microsoft.PowerBI.Api
Om din app tidigare användes Microsoft.AspNetCore
för att autentisera tar du bort det här paketet från projektet genom att skriva:
dotnet remove package Microsoft.AspNetCore.Authentication.AzureAD.UI
Steg 4 – Aktivera autentisering på serversidan
Aktivera autentisering på serversidan i din app genom att skapa eller ändra filerna i följande tabell.
Fil | Använd |
---|---|
Startup.cs | Initiera autentiseringstjänsten Microsoft.Identity.Web |
appsettings.json | Autentiseringsinformation |
PowerBiServiceApi.cs | Hämta Microsoft Entra-token och inbäddningsmetadata |
HomeController.cs | Skicka inbäddningsdata som en modell till vyn |
Konfigurera startfilen så att den stöder Microsoft.Identity.Web
Ändra koden i Startup.cs för att initiera autentiseringstjänsten som tillhandahålls av Microsoft.Identity.Web
.
Lägg till följande kodfragment i appens Startup.cs-fil .
Kommentar
Koden i ConfigureServices
åstadkommer flera viktiga saker:
- Anropet till
AddMicrosoftWebAppCallsWebApi
konfigurerar Microsoft-autentiseringsbiblioteket för att hämta åtkomsttoken (Microsoft Entra-token). - Anropet till
AddInMemoryTokenCaches
konfigurerar en tokencache som Microsoft-autentiseringsbiblioteket ska använda för att cachelagrar åtkomsttoken och uppdateringstoken i bakgrunden - Anropet
PowerBiServiceApi
tillservices.AddScoped(typeof(PowerBiServiceApi))
konfigurerar klassen som en tjänstklass som kan läggas till i andra klasser med hjälp av beroendeinmatning.
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();
}
}
}
Skapa en autentiseringsinformationsfil
I den här självstudien appsettings.json
innehåller filen känslig information, till exempel klient-ID och klienthemlighet. Av säkerhetsskäl rekommenderar vi inte att du behåller den här informationen i inställningsfilen. När du bäddar in i ditt program bör du överväga en säkrare metod som Azure Key Vault för att behålla den här informationen.
I projektet skapar du en ny fil och anropar den appsettings.json.
Lägg till följande kod i appsettings.json:
{ "AzureAd": { "Instance": "https://login.microsoftonline.com/", "Domain": "", "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": "*" }
Fyll i de inbäddningsparametervärden som hämtats från steg 2 – Hämta parametervärdena för inbäddning.
Domain
- Domän- och klientorganisations-IDTenantId
- Domän- och klientorganisations-IDClientId
- Klient-IDClientSecret
- Client secret
Kommentar
I föregående kodfragment läggs parametern PowerBi:ServiceRootUrl
till som ett anpassat konfigurationsvärde för att spåra bas-URL:en till Power BI-tjänst. När du programmerar mot Power BI-tjänst i Microsofts offentliga moln är https://api.powerbi.com/
URL:en . Rot-URL:en för Power BI-tjänst kommer dock att skilja sig åt i andra moln, till exempel myndighetsmolnet. Därför lagras det här värdet som ett projektkonfigurationsvärde så det är enkelt att ändra när det behövs.
Hämta Microsoft Entra-åtkomsttoken och anropa Power BI-tjänst
För att kunna bädda in Power BI-innehåll (till exempel rapporter och instrumentpaneler) måste appen hämta en Microsoft Entra-token. För att hämta token behöver du ett konfigurationsobjekt.
Koden i det här avsnittet använder .NET Core-beroendeinmatningsmönstret. När klassen behöver använda en tjänst kan du lägga till en konstruktorparameter för den tjänsten och .NET Core-körningen tar hand om att skicka tjänstinstansen vid körning. I det här fallet matar konstruktorn in en instans av .NET Core-konfigurationstjänsten med hjälp av parametern IConfiguration
, som används för att hämta konfigurationsvärdet PowerBi:ServiceRootUrl
från appsettings.json. Parametern ITokenAcquisition
, som heter tokenAcquisition
innehåller en referens till Microsoft-autentiseringstjänsten som tillhandahålls av Microsoft.Identity.Web
biblioteket och används för att hämta åtkomsttoken från Microsoft Entra-ID.
Fältet RequiredScopes
innehåller en strängmatris som innehåller en uppsättning delegerade behörigheter som stöds av Power BI-tjänst-API:et. När ditt program anropar över nätverket för att hämta en Microsoft Entra-token skickar den här uppsättningen delegerade behörigheter så att Microsoft Entra-ID:t kan inkludera dem i den åtkomsttoken som det returnerar.
Kommentar
Kontrollera att din Microsoft Entra-app har konfigurerats med de omfång som krävs av webbappen. Mer information finns i Ändra behörigheter för din Microsoft Entra-app.
Skapa en ny mapp med namnet Tjänster i appens projekt.
I mappen Tjänster skapar du en ny fil med titeln PowerBiServiceApi.cs.
Lägg till följande kod i 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() }; } } }
Ändra filen HomeController.cs
I det här kodexemplet använder du beroendeinmatning. När du registrerade PowerBiServiceApi
klassen som en tjänst genom att anropa services.AddScoped
i ConfigureServices
-metoden. Du kan lägga till en PowerBiServiceApi
parameter i konstruktorn och .NET Core-körningen tar hand om att skapa en PowerBiServiceApi
instans och skicka den till konstruktorn.
Öppna HomeController.cs-filen från mappen Controllers och lägg till den i följande kodfragment:
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 });
}
}
}
Steg 5 – Skapa appens klientsida
För implementering på klientsidan måste du skapa eller ändra filerna i följande tabell.
Fil | Använd |
---|---|
embed.js | Innehåller JavaScript-koden på klientsidan |
Embed.cshtml | Innehåller appens dokumentobjektmodell (DOM) och en DIV för att bädda in rapporten |
Skapa en container för din inbäddade rapport
Skapa filen Embed.cshtml, som har ett div
element som används som en container för din inbäddade rapport, och tre skript.
I mappen Visa>start skapar du en fil med namnet Embed.cshtml.
Lägg till följande kodfragment i filen 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> }
Lägg till JavaScript på klientsidan för att bädda in rapporten
Om du vill bädda in Power BI-innehåll måste du skapa ett konfigurationsobjekt. Mer information om hur du skapar konfigurationsobjektet finns i Bädda in en rapport.
I det här avsnittet skapar du en JavaScript-fil med namnet embed.js med ett konfigurationsobjekt för att bädda in rapporten med hjälp av variabeln models
.
models
initieras med hjälp av ett anrop till window['powerbi-client'].models
. Variabeln models
används för att ange konfigurationsvärden som models.Permissions.All
, models.TokenType.Aad
och models.ViewMode.View
.
Funktionen powerbi.embed
använder konfigurationsobjektet models
för att bädda in rapporten.
I mappen wwwroot>js skapar du en fil med namnet embed.js.
Lägg till följande kodfragment i embed.js-filen.
$(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); }); });
Steg 6 – Kör programmet
När du har gjort alla justeringar som anges i den här självstudien är du redo att köra programmet. Kör ditt program och experimentera med hur Power BI-rapporten är inbäddad. Du kan använda Api:er för Power BI Embedded-analysklienten för att förbättra din app med hjälp av API:er på klientsidan.
När appen är klar kan du flytta den inbäddade appen till produktion.