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

Resurser

I den här självstudien använder du:

Metod

Följ dessa steg om du vill bädda in Power BI-innehåll i en inbäddning för din organisationslösning :

  1. Konfigurera din Microsoft Entra-app
  2. Hämta parametervärdena för inbäddning
  3. Lägg till nödvändiga NuGet-paket
  4. Aktivera autentisering på serversidan
  5. Skapa appens klientsida
  6. 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):

  1. Logga in på Microsoft Azure.

  2. Sök efter Appregistreringar och välj länken Appregistreringar.

  3. Välj den Microsoft Entra-app som du använder för att bädda in ditt Power BI-innehåll.

  4. I avsnittet Översikt kopierar du program-ID:t (klient-ID :t).

Klienthemlighet

Följ dessa steg för att hämta klienthemligheten:

  1. Logga in på Microsoft Azure.

  2. Sök efter Appregistreringar och välj länken Appregistreringar.

  3. Välj den Microsoft Entra-app som du använder för att bädda in ditt Power BI-innehåll.

  4. Under Hantera väljer du Certifikat och hemligheter.

  5. Under Klienthemligheter väljer du Ny klienthemlighet.

  6. 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.

  7. 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:

  1. Logga in på Power BI-tjänst.

  2. Öppna den rapport som du vill bädda in.

  3. Kopiera GUID från URL:en. GUID är talet mellan /groups/ och /reports/.

    En skärmbild som visar arbetsyte-ID GUID i Power BI-tjänst URL

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:

  1. Logga in på Power BI-tjänst.

  2. Öppna den rapport som du vill bädda in.

  3. Kopiera GUID från URL:en. GUID är talet mellan /reports/ och /ReportSection.

    En skärmbild som visar rapport-ID GUID i Power BI-tjänsten U R L

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.Webi 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:

  1. Anropet till AddMicrosoftWebAppCallsWebApi konfigurerar Microsoft-autentiseringsbiblioteket för att hämta åtkomsttoken (Microsoft Entra-token).
  2. Anropet till AddInMemoryTokenCaches konfigurerar en tokencache som Microsoft-autentiseringsbiblioteket ska använda för att cachelagrar åtkomsttoken och uppdateringstoken i bakgrunden
  3. Anropet PowerBiServiceApi till services.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.

  1. I projektet skapar du en ny fil och anropar den appsettings.json.

  2. 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": "*"
    }
    
  3. Fyll i de inbäddningsparametervärden som hämtats från steg 2 – Hämta parametervärdena för inbäddning.

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.

  1. Skapa en ny mapp med namnet Tjänster i appens projekt.

  2. I mappen Tjänster skapar du en ny fil med titeln PowerBiServiceApi.cs.

  3. 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.

  1. I mappen Visa>start skapar du en fil med namnet Embed.cshtml.

  2. 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.Aadoch models.ViewMode.View.

Funktionen powerbi.embed använder konfigurationsobjektet models för att bädda in rapporten.

  1. I mappen wwwroot>js skapar du en fil med namnet embed.js.

  2. 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.