Uso de la seguridad de nivel de fila con contenido insertado de Power BIUse row-level security with Power BI embedded content

La seguridad de nivel de fila (RLS) se puede usar para restringir el acceso de usuarios a los datos de paneles, iconos, informes y conjuntos de datos.Row level security (RLS) can be used to restrict user access to data within dashboards, tiles, reports, and datasets. Varios usuarios diferentes pueden trabajar con esos mismos artefactos mientras ven otros datos distintos.Multiple, different users can work with those same artifacts all while seeing different data. La inserción admite RLS.Embedding supports RLS.

Si va a realizar una inserción para usuarios que no son de Power BI (la aplicación posee los datos), que es normalmente un escenario de ISV, este es el artículo que necesita.If you're embedding for non-Power BI users (app owns data), which is typically an ISV scenario, then this article is for you! Deberá configurar el token de inserción para considerar el usuario y el rol.You will need to configure the embed token to account for the user and role. Siga leyendo para saber cómo hacerlo.Read on to learn how to do this.

Si va a realizar la inserción para usuarios de Power BI (el usuario posee los datos), dentro de su organización, RLS funciona igual que dentro del servicio de Power BI directamente.If you are embedding to Power BI users (user owns data), within your organization, RLS works the same as it does within the Power BI service directly. No tiene que hacer nada más en la aplicación.There is nothing more you need to do in your application. Para más información, consulte Seguridad de nivel de fila (RLS) con Power BI.For more information see, Row-Level security (RLS) with Power BI.

Elementos relacionados con la seguridad de nivel de fila.

Para aprovechar las ventajas de RLS, es importante que comprenda tres conceptos principales: usuarios, roles y reglas.To take advantage of RLS, it’s important you understand three main concepts; Users, Roles, and Rules. Analicemos cada uno de ellos detenidamente:Let’s take a closer look at each:

Usuarios: los usuarios finales que ven el artefacto (panel, icono, informe o conjunto de datos).Users – End-users viewing the artifact (dashboard, tile, report, or dataset). En Power BI Embedded, los usuarios se identifican por la propiedad de nombre de usuario de un token de inserción.In Power BI Embedded, users are identified by the username property in an embed token.

Roles: los usuarios pertenecen a roles.Roles – Users belong to roles. Un rol es un contenedor de reglas y se puede designar algo como Representante de ventas o Rep. de ventas. Los roles se crean en Power BI Desktop.A role is a container for rules and can be named something like Sales Manager or Sales Rep. You create roles within Power BI Desktop. Para más información, consulte Seguridad de nivel de fila (RLS) con Power BI Desktop.For more information, see Row-level security (RLS) with Power BI Desktop.

Reglas: los roles tienen reglas y esas reglas son los filtros reales que se van a aplicar a los datos.Rules – Roles have rules, and those rules are the actual filters that are going to be applied to the data. Podría ser algo tan sencillo como "País = USA" o algo mucho más dinámico.This could be as simple as “Country = USA” or something much more dynamic. En el resto de este artículo, se proporcionará un ejemplo de la creación de RLS y su utilización dentro de una aplicación insertada.For the rest of this article, we’ll provide an example of authoring RLS, and then consuming that within an embedded application. En nuestro ejemplo se usa el archivo PBIX de ejemplo de análisis de minoristas.Our example uses the Retail Analysis Sample PBIX file.

Ejemplo de informe

Adición de roles con Power BI DesktopAdding roles with Power BI Desktop

El ejemplo de análisis de minoristas muestra las ventas de todas las tiendas de una cadena de minoristas.Our Retail Analysis sample shows sales for all the stores in a retail chain. Sin RLS, no importa qué jefe de distrito inicie la sesión y vea el informe, ya que verá los mismos datos.Without RLS, no matter which district manager signs in and views the report, they’ll see the same data. La administración senior ha determinado que cada jefe de distrito solo debe ver las ventas de las tiendas que administra y, para ello, se puede usar RLS.Senior management has determined each district manager should only see the sales for the stores they manage, and to do this, we can use RLS.

RLS se crea en Power BI Desktop.RLS is authored in Power BI Desktop. Cuando se abren el conjunto de datos y el informe, se puede cambiar a una vista de diagrama para ver el esquema:When the dataset and report are opened, we can switch to diagram view to see the schema:

Vista de diagrama en Power BI Desktop

Estos son algunos aspectos que debe observar con este esquema:Here are a few things to notice with this schema:

  • Todas las medidas, como Total Sales, se almacenan en la tabla de hechos Sales.All measures, like Total Sales, are stored in the Sales fact table.
  • Hay cuatro tablas de dimensiones relacionadas adicionales: Item, Time, Store y District.There are four additional related dimension tables: Item, Time, Store, and District.
  • Las flechas de las líneas de relación indican de qué forma los filtros pueden fluir de una tabla a otra.The arrows on the relationship lines indicate which way filters can flow from one table to another. Por ejemplo, si se coloca un filtro en Time[Date], en el esquema actual solo se filtrarían los valores de la tabla Sales.For example, if a filter is placed on Time[Date], in the current schema it would only filter down values in the Sales table. Ninguna otra tabla se vería afectada por este filtro ya que todas las flechas de las líneas de relación apuntan a la tabla de ventas y no fuera.No other tables would be affected by this filter since all the arrows on the relationship lines point to the sales table and not away.
  • La tabla District indica quién es el jefe de cada distrito:The District table indicates who the manager is for each district:

    Filas de la tabla Distrito

Según este esquema, si se aplica un filtro a la columna District Manager de la tabla District, y si ese filtro coincide con el usuario que ve el informe, ese filtro también filtrará las tablas Store y Sales para mostrar únicamente los datos de ese jefe de distrito.Based on this schema, if we apply a filter to the District Manager column in the District table, and if that filter matches the user viewing the report, that filter will also filter down the Store and Sales tables to only show data for that district manager.

Le mostramos cómo:Here's how:

  1. En la ficha Modelado, seleccione Administrar roles.On the Modeling tab, select Manage Roles.

    Pestaña Modelado de Power BI Desktop

  2. Cree un nuevo rol llamado Manager.Create a new role called Manager.

    Creación de un nuevo rol

  3. En la tabla District, escriba la siguiente expresión DAX: [District Manager] = USERNAME().In the District table, enter the following DAX expression: [District Manager] = USERNAME().

    Instrucción DAX para regla de RLS

  4. Para asegurarse de que las reglas funcionan, en la pestaña Modelado, seleccione Ver como roles y luego seleccione el rol Manager que acaba de crear, junto con Otro rol.To make sure the rules are working, on the Modeling tab, select View as Roles, and then select both the Manager role you just created, along with Other user. Escriba Andrew Ma para el usuario.Enter Andrew Ma for the user.

    Cuadro de diálogo Ver como roles

    Los informes mostrarán los datos como si hubiera iniciado sesión como Andrew Ma.The reports will now show data as if you were signed in as Andrew Ma.

Al aplicar el filtro, como se ha hecho aquí, se filtran todos los registros de las tablas District, Store y Sales.Applying the filter, the way we did here, will filter down all records in the District, Store, and Sales tables. Sin embargo, debido a la dirección del filtro en las relaciones entre las tablas Sales y Time, Sales e Item e Item y Time, no se filtrarán.However, because of the filter direction on the relationships between Sales and Time, Sales and Item, and Item and Time tables will not be filtered down. Para aprender más sobre filtrado cruzado bidireccional, descargue el documento técnico sobre el filtrado cruzado bidireccional en SQL Server Analysis Services 2016 y Power BI Desktop.To learn more about bidirectional cross-filtering, download the Bidirectional cross-filtering in SQL Server Analysis Services 2016 and Power BI Desktop whitepaper.

Aplicación de usuarios y roles a un token de inserciónApplying user and role to an embed token

Ahora que tiene configurados los roles de Power BI Desktop, es necesario hacer algunas cosas en la aplicación para aprovechar sus ventajas.Now that you have your Power BI Desktop roles configured, there is some work needed in your application to take advantage of the roles.

La aplicación autentica y autoriza a los usuarios y los tokens de inserción se usan para conceder a ese usuario acceso a un informe específico de Power BI Embedded.Users are authenticated and authorized by your application and embed tokens are used to grant that user access to a specific Power BI Embedded report. Power BI Embedded no tiene ninguna información específica sobre quién es el usuario.Power BI Embedded doesn’t have any specific information on who your user is. Para que RLS funcione, es necesario pasar algún contexto adicional como parte del token de inserción en forma de identidades.For RLS to work, you’ll need to pass some additional context as part of your embed token in the form of identities. Esto se hace mediante la API GenerateToken.This is done by way GenerateToken API.

La API GenerateToken acepta una lista de identidades con indicación de los conjuntos de datos pertinentes.The GenerateToken API accepts a list of identities with indication of the relevant datasets. Para que RLS funcione, deberá pasar lo siguiente como parte de la identidad.For RLS to work, you will need to pass the following as part of the identity.

  • nombre de usuario (obligatorio): una cadena que se puede usar para ayudar a identificar el usuario al aplicar reglas de RLS.username (mandatory) – This is a string that can be used to help identify the user when applying RLS rules. Se puede mostrar un único usuario.Only a single user can be listed.
  • roles (obligatorio): una cadena que contiene los roles que se seleccionarán al aplicar reglas de seguridad de nivel de fila.roles (mandatory) – A string containing the roles to select when applying Row Level Security rules. Si se pasa más de un rol, se deben pasar como una matriz de cadenas.If passing more than one role, they should be passed as a string array.
  • conjunto de datos (obligatorio): el conjunto de datos que es aplicable al artefacto que se va a insertar.dataset (mandatory) – The dataset that is applicable for the artifact you are embedding.

Puede crear el token de inserción mediante el método GenerateTokenInGroup de PowerBIClient.Reports.You can create the embed token by using the GenerateTokenInGroup method on PowerBIClient.Reports.

Por ejemplo, podría cambiar el ejemplo PowerBIEmbedded_AppOwnsData.For example, you could change the PowerBIEmbedded_AppOwnsData sample. La línea 76 y 77 de Home\HomeController.cs se podría actualizar de:Home\HomeController.cs line 76 and 77 could be updated from:

// Generate Embed Token.
var generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view");

var tokenResponse = await client.Reports.GenerateTokenInGroupAsync(GroupId, report.Id, generateTokenRequestParameters);

ato

var generateTokenRequestParameters = new GenerateTokenRequest("View", null, identities: new List<EffectiveIdentity> { new EffectiveIdentity(username: "username", roles: new List<string> { "roleA", "roleB" }, datasets: new List<string> { "datasetId" }) });

var tokenResponse = await client.Reports.GenerateTokenInGroupAsync("groupId", "reportId", generateTokenRequestParameters);

Si llama a la API de REST, la API actualizada acepta ahora una matriz JSON adicional, llamada identities, que contiene un nombre de usuario, una lista de roles de cadena y una lista de conjuntos de datos de cadena, por ejemplo:If you are calling the REST API, the updated API now accepts an additional JSON array, named identities, containing a user name, list of string roles and list of string datasets, e.g.:

{
    "accessLevel": "View",
    "identities": [
        {
            "username": "EffectiveIdentity",
            "roles": [ "Role1", "Role2" ],
            "datasets": [ "fe0a1aeb-f6a4-4b27-a2d3-b5df3bb28bdc" ]
        }
    ]
}

Ahora, una vez encajadas todas las piezas, cuando alguien inicie sesión en la aplicación para ver este artefacto, solo podrá ver los datos para los que tiene permiso, tal como se define en la seguridad de nivel de fila.Now, with all the pieces together, when someone logs into your application to view this artifact, they’ll only be able to see the data that they are allowed to see, as defined by our row-level security.

Trabajo con conexiones activas de Analysis ServicesWorking with Analysis Services live connections

La seguridad de nivel de fila se puede usar con conexiones dinámicas de Analysis Services para servidores locales.Row-level security can be used with Analysis Services live connections for on-premises servers. Hay algunos conceptos específicos que debe conocer al usar este tipo de conexión.There are a few specific concepts that you should understand when using this type of connection.

La identidad efectiva que se proporciona para la propiedad username debe ser la de un usuario de Windows con permisos en el servidor de Analysis Services.The effective identity that is provided for the username property must be a Windows user with permissions on the Analysis Services server.

Configuración de una puerta de enlace de datos localOn-premises data gateway configuration

Una puerta de enlace de datos local se usa cuando se trabaja con conexiones dinámicas de Analysis Services.An on-premises data gateway is used when working with Analysis Services live connections. Cuando se genera un token de inserción, con una identidad mostrada, la cuenta maestra debe aparecer como administrador de la puerta de enlace.When generating an embed token, with an identity listed, the master account needs to be listed as an admin of the gateway. Si no aparece la cuenta maestra, la seguridad de nivel de fila no se aplicará a los datos.If the master account is not listed, the row-level security will not be applied property to the data. Un usuario de la puerta de enlace distinto del administrador puede proporcionar roles, pero deberá especificar su propio nombre de usuario para la identidad efectiva.A non-admin of the gateway can provide roles, but must specify its own username for the effective identity.

Uso de rolesUse of roles

Los roles se pueden proporcionar con la identidad en un token de inserción.Roles can be provded with the identity in an embed token. Si no se proporciona ningún rol, se utilizará el nombre de usuario que se proporcionó para resolver los roles asociados.If no role is provided, the username that was provided will be used to resolve the associated roles.

Consideraciones y limitacionesConsiderations and limitations

  • La asignación de usuarios a roles dentro del servicio Power BI no afecta a RLS cuando se usa un token de inserción.Assignment of users to roles within the Power BI service does not affect RLS when using an embed token.
  • Aunque el servicio Power BI no aplicará valores de RLS a administradores o miembros con permisos de edición, cuando se suministre una identidad con un token de inserción, se aplicará a todos los datos.While the Power BI service will not apply RLS setting to admins or members with edit permissions, when you supply an identity with an embed token, it will be applied to the data.
  • Se admiten las conexiones activas de Analysis Services para los servidores locales.Analysis Services live connections are supported for on-premises servers.
  • Las conexiones activas de Azure Analysis Services admiten el filtrado por rol, pero no el filtrado dinámico por nombre de usuario.Azure Analysis Services live connections support filtering by roles, but not dynamic by username.
  • Si el conjunto de datos subyacente no requiere RLS, la solicitud GenerateToken no debe contener una identidad efectiva.If the underlying dataset doesn’t require RLS, the GenerateToken request must not contain an effective identity.
  • Si el conjunto de datos subyacente es un modelo de nube (modelo en caché o DirectQuery), la identidad efectiva debe incluir al menos un rol ya que, de lo contrario, la asignación de roles no se producirá.If the underlying dataset is a cloud model (cached model or DirectQuery), the effective identity must include at least one role, otherwise role assignment will not occur.
  • Una lista de identidades habilita varios tokens de identidad para la inserción del panel.A list of identities enables multiple identity tokens for dashboard embedding. Para todos los demás artefactos, la lista contiene una sola identidad.For all others artifacts, the list contains a single identity.

¿Tiene más preguntas?More questions? Pruebe a preguntar a la comunidad de Power BITry asking the Power BI Community