Informe de Power BI
PowerBIReport muestra un informe de Power BI en el portal a usuarios que no tienen licencia de Power BI, y cada espectador solo ve sus propias filas. Está en su propio paquete — PowerPortalsPro.Web.Blazor.PowerBI para Blazor, @powerportalspro/react-powerbi para React — por lo que un portal que no muestra informes no lleva el script de Power BI.
import { PowerBIReport } from '@powerportalspro/react-powerbi';
<PowerBIReport reportKey="account-sales" height="700px" />@using PowerPortalsPro.Web.Blazor.PowerBI.Components
<PowerBIReport ReportKey="account-sales" Height="700px" />Cómo funciona
El componente nombra un informe mediante una clave. El portal busca la clave, decide si el espectador puede ver el informe y pide a Power BI un token para ellos — como la identidad que ya tiene con Dataverse, así que no hay nada más que configurar en el portal. El token lleva el ID del espectador como nombre de usuario: su ID de contacto, o su ID de usuario cuando el personal inicia sesión en el portal. Los visitantes que no están conectados reciben el nombre anonymousde usuario. El componente renueva el token unos minutos antes de que caduque y el informe mantiene su estado cuando lo hace.
Cada visor puede pedir tokens de informe 30 veces por minuto — un usuario iniciado sesión por su cuenta, un visitante por su dirección — y se le rechaza con un 429 más allá de esa cifra. Un token se reutiliza mientras tiene tiempo para ejecutarse, por lo que una página nunca se acerca a él; el límite impide que un visor convierta solicitudes repetidas en una carga en el portal o Power BI. Cámbialo con PowerPortalsPro:PowerBIRateLimit:PermitLimit y Window en configuración; una PermitLimit cantidad de 0 lo apaga.
Registro de un informe
Qué informes puede mostrar un portal, y a quién, son datos en Dataverse en lugar de código, porque cada entorno incrusta informes desde su propio espacio de trabajo. Dos tablas en la solución Power Portals Pro lo mantienen:
- Portal Power BI Report — la clave que un componente nombra, y el espacio de trabajo y el informe de Power BI que representa. Permitir sin seguridad a nivel de fila está desactivado por defecto: un informe cuyo modelo no tiene seguridad a nivel de fila es rechazado, porque todos los espectadores verían cada fila.
- Portal Power BI Report Access — quién puede ver el informe y qué roles de su modelo tienen. Cada fila es para titulares de un rol en el portal, todos los usuarios iniciados sesión, visitantes anónimos o usuarios internos — el personal iniciado sesión como él mismo en lugar de como contacto — y nombra los roles del modelo en Power BI Roles, separados por comas.
Un espectador ve el informe cuando cualquiera de sus filas de acceso se aplica a él, y en cada rol se nombran las filas que se aplican. Una clave que no nombra ningún informe y un informe que no es para el visor se ven igual: un mensaje de que el informe no está disponible. Los registros se leen cada quince minutos; borra la PowerBIReports caché para aplicar un cambio de inmediato.
Seguridad a nivel de fila
Power BI aplica la seguridad a nivel de fila del informe al nombre de usuario del token. Para mantener cada visor en sus propias filas, asigna al modelo un rol que compare la columna que contiene un id de contacto con USERNAME():
[contactid] = USERNAME()
El portal comprueba el modelo antes de pedir un token. Un modelo con seguridad a nivel de fila obtiene el id y los roles del espectador en cada token, y una fila de acceso que no nombra ningún rol es rechazada. Power BI no comprueba los nombres de roles, así que un rol mal escrito falla solo cuando se dibuja el informe: el servidor MCP los comprueba con el modelo al escribir filas de acceso.
Datos personalizados
Un rol puede filtrar algo distinto a quién es el espectador — el número de su cuenta, su región — a través de CUSTOMDATA()DAX. Regístrate en IPowerBICustomDataProvider el Program.csservidor : se le pide cada token que el portal emite para un elemento cuyo modelo utiliza seguridad a nivel de fila, con el visor y el elemento, y lo que devuelva va al token. Se ejecuta en el servidor y nunca se extrae del navegador, porque decide qué filas ve un espectador. No se le pide un elemento mostrado con el acceso propio de Power BI del espectador.
// Program.cs
builder.Services.AddScoped<IPowerBICustomDataProvider, RegionCustomData>();
// The viewer's sales region, from a lookup of your own, for a role that filters on it:
// NOT ISBLANK(CUSTOMDATA()) && [region] = CUSTOMDATA()
public class RegionCustomData(IRegionLookup regions) : IPowerBICustomDataProvider
{
public async ValueTask<string?> GetCustomDataAsync(PowerBICustomDataContext context, CancellationToken cancellationToken)
=> context.User.GetContactId() is { } contactId
? await regions.RegionOfAsync(contactId, cancellationToken)
: null;
}
El servidor add_powerbi_rls_role MCP escribe dicho rol con filter: "customdata", comparando una columna de texto o número. Su filtro también requiere datos personalizados en el token, por lo que un token sin ninguno muestra filas, en lugar de cada fila cuya columna está en blanco.
Configurándolo con el servidor MCP
El servidor MCP configura todo menos el propio informe, actuando como una cuenta de Power BI con la que inicias sesión una vez por carpeta con dnx PowerPortalsPro.Mcp powerbi login. Esa cuenta necesita una licencia Power BI Pro. Pide a tu asistente que configure un informe, o llama tú mismo a las herramientas:
create_powerbi_workspacecrea el espacio de trabajo en el que publicas el informe desde Power BI Desktop.grant_powerbi_workspace_accessconvierte la identidad del portal en un miembro de él.add_powerbi_rls_roleEscribe un rol en el modelo del informe: uno que mantiene al espectador en las filas de su propio contacto, en las de su empresa, en las de su empresa y sus filiales, en los que una tabla de mapeo lista contra ellos, o en valores fijos — o uno que muestre cada fila. Le da al DAX la oportunidad de añadir el mismo papel en Power BI Desktop, porque publicar el informe de nuevo reemplaza su modelo.register_powerbi_reportyset_powerbi_report_accessescribir las dos tablas Dataverse.check_powerbiRevisa toda la cadena, iniciada como el propio portal.
Dos configuraciones de tenant de Power BI son algo que un administrador de Fabric debe cambiar: los principales de servicio pueden llamar a las APIs públicas de Fabric e incrustar contenido en las aplicaciones. Los nuevos tenants tienen ambos activados. Cuando cualquiera está apagado, check_powerbi indica cuál activar.
Abrir en una página, filtrado a un registro
PageName abre el informe en una página y Filters lo reduce a filas cuya columna contiene uno de los valores — por ejemplo, la cuenta sobre la que trata una página de detalles. Cambiar cualquiera de los dos se aplica al informe ya mostrado, sin recargarlo. Un filtro es una comodidad, no una seguridad: el espectador puede eliminarlo en su navegador. Lo que pueden ver se decide por la seguridad a nivel de fila.
<PowerBIReport
reportKey="account-sales"
pageName="ReportSection2"
filters={[{ table: 'Account', column: 'accountid', values: [accountId] }]}
/><PowerBIReport ReportKey="account-sales"
PageName="ReportSection2"
Filters="@(new[] { new PowerBIFilter("Account", "accountid", accountId) })" />Salpicaderos y azulejos simples
Un registro puede nombrar un panel de control, o una casilla de un panel, en lugar de un informe — su tipo de artículo, con el id del panel y el del mosaico. El mismo componente lo muestra: PowerBIReport incrusta los nombres de registro de la clave. Un panel muestra ajustado a su ancho y OnTileClicked (onTileClicked) indica cuándo se hace clic en una casilla y hacia dónde conduce. Una página, filtros, paneles y los colores del portal solo se aplican a un informe: un panel o mosaico muestra tal como fue creado.
Los mosaicos de un panel pueden provenir de varios modelos semánticos, y cada uno se somete a las mismas reglas que el de un informe: un modelo con seguridad a nivel de fila obtiene la identidad y los roles del espectador, y uno sin ellos es rechazado a menos que el registro lo permita. Un mosaico de texto o una imagen no lee filas y no necesita ninguno.register_powerbi_report toma , y tile para uno de sus mosaicos, y list_powerbi_reports lista los paneles y mosaicos de un espacio de trabajo. Los mosaicos se fijan en el servicio Power BI; no hay forma de fijar uno dashboarddesde fuera.
El acceso propio a Power BI de cada visor
El Modo de Incrustación de un registro puede mostrar el elemento con el acceso propio a Power BI de cada espectador en lugar del portal, como lo verían en Power BI. Power BI aplica su propio modo de compartir y la seguridad a nivel de fila de los modelos — USERPRINCIPALNAME() es el nombre con el que inician sesión — por lo que cada visitante necesita una cuenta de trabajo o escolar, una licencia de Power BI y el elemento compartido con ellos. Las filas de acceso siguen indicando quién puede preguntar; sus roles en Power BI no se utilizan. Es adecuado para el personal y socios que ya usan Power BI. Para los clientes, el acceso propio del portal no necesita licencia.
La primera vez, el componente ofrece conectar la cuenta de trabajo del visor a Power BI. Inician sesión con Microsoft, aceptan que el portal lea sus informes y paneles de Power BI, y vuelven a la página. Lo que eso da al portal permanece en el servidor, cifrado en el IDistributedCachedel anfitrión; el navegador solo recibe un token de acceso de corta duración. Con la caché en memoria, los espectadores se reconectan tras el reinicio del portal, y una caché compartida (Redis, SQL Server) los mantiene conectados. Cerrar sesión los desconecta. Una cuenta personal de Microsoft, Google o una contraseña no pueden conectarse, ni tampoco una sesión que alguien esté suplantando.
Los espectadores se conectan a través del registro de la app de inicio de sesión de Microsoft del portal, que necesita Power BI Report.Read.All delegado y Dashboard.Read.All, Microsoft Graph openid y offline_access, y el URI https://<portal host>/signin-powerbide redirección . El servidor add_powerbi_signin_permissions MCP los añade todos y register_powerbi_report toma embedMode: "user". Un tenant que solo permite el consentimiento de los administradores necesita uno para concederlo una vez. Para dejar entrar también a los invitados del inquilino, se asigna PowerBIOptions.TenantId al tenant que mantiene los espacios de trabajo.
Colores y modo oscuro
Por defecto, el informe toma los colores del portal: su tema claro o oscuro, su color de acento y la paleta de series que usan los propios gráficos del portal. Sigue el tema cuando el visitante lo cambia, sin necesidad de recargar. Los colores se leen desde el tema Fluent donde está el informe, y se aplican como un tema de informe de Power BI, que establece la página, el texto, los ejes, el panel de filtro y la serie del informe. Un color que el autor del informe ha establecido en un visual permanece como lo ha configurado, y Power BI dibuja las pestañas de página debajo del informe con sus propios colores, sea cual sea el tema.
ThemeJson le da al informe un tema propio, en formato JSON de temas de Power BI; como cualquier tema aplicado a un informe incrustado, sustituye al tema guardado del informe en lugar de añadirlo. UsePortalTheme="false" mantiene el tema con el que se guardó el informe.
<PowerBIReport reportKey="sales" themeJson={contosoTheme} />
<PowerBIReport reportKey="sales" usePortalTheme={false} /><PowerBIReport ReportKey="sales" ThemeJson="@contosoTheme" />
<PowerBIReport ReportKey="sales" UsePortalTheme="false" />Desarrollo y producción
Un espacio de trabajo sin capacidad recibe los tokens de prueba de Power BI, que son limitados en número, muestran un banner y son para desarrollo y prueba. En producción, pon el espacio de trabajo en capacidad de Fabric: create_powerbi_capacity crea uno en tu suscripción a Azure tras mostrar su precio y set_powerbi_capacity_state pausa. Una capacidad pausada no genera informes. No se soporta incrustar para visitantes de portales en un espacio de trabajo Premium Por Usuario.
PowerBIReport Clase
Parámetros
Nombre | Tipo | Default | Descripción |
|---|---|---|---|
FilterPaneVisible | bool | False | |
Filters | IReadOnlyList<PowerBIFilter>? | ||
Height | string | 600px | |
PageName | string? | ||
PageNavigationVisible | bool | True | |
ReportKey* | string | ||
ThemeJson | string? | ||
TransparentBackground | bool | False | |
UsePortalTheme | bool | True | |
Width | string | 100% |
FilterPaneVisibleFiltersHeightPageNamePageNavigationVisibleReportKey*ThemeJsonTransparentBackgroundUsePortalThemeWidthEventos
Nombre | Tipo | Descripción |
|---|---|---|
OnDataSelected | EventCallback<PowerBIDataSelection> | |
OnError | EventCallback<string> | |
OnLoaded | EventCallback | |
OnPageChanged | EventCallback<PowerBIPage> | |
OnRendered | EventCallback | |
OnTileClicked | EventCallback<PowerBITileClick> |
OnDataSelectedOnErrorOnLoadedOnPageChangedOnRenderedOnTileClickedMétodos
Nombre | Parámetros | Tipo | Descripción |
|---|---|---|---|
NotifyDataSelectedAsync | PowerBIDataSelection selection | Task | |
NotifyErrorAsync | string message | Task | |
NotifyLoadedAsync | Task | ||
NotifyPageChangedAsync | PowerBIPage page | Task | |
NotifyRenderedAsync | Task | ||
NotifyTileClickedAsync | PowerBITileClick click | Task | |
RenewTokenAsync | Task<PowerBIEmbedTokenResponse> |
NotifyDataSelectedAsyncNotifyErrorAsyncNotifyLoadedAsyncNotifyPageChangedAsyncNotifyRenderedAsyncNotifyTileClickedAsyncRenewTokenAsync