Отключить режим редактирования для встроенного отчета Power BI

Я создал собственное приложение и установил разрешения в Azure Active Directory только для просмотра, и я использую это для предоставления отчета с помощью Power BI Embedded (с использованием C # SDK). Однако относительно просто отредактировать JavaScript, чтобы перевести отчет в режим редактирования, тем самым открыв основные данные. Есть ли способ предотвратить редактирование отчета при использовании Power BI Embedded или, наоборот, обеспечить совместное использование только разрешенных данных?


person rudivonstaden    schedule 05.11.2018    source источник


Ответы (1)


Хотя редактирование отчета может быть отменено при изменении кода JS, этот пользователь не сможет сохранить или изменить сам отчет, поскольку предоставленный EmbedToken должен быть без разрешения на запись.

При создании EmbedToken вы, как владелец отчета, объявляете, какие возможности вы предоставляете пользователю в этом конкретном отчете. Если вы не предоставили пользователям права на запись, все, что они могут сделать, будет чисто локальным путем изменения JS.

Это определяется как accessLevel в: https://docs.microsoft.com/en-us/rest/api/power-bi/embedtoken/reports_generatetoken

Если проблема заключается в доступе к данным, этого можно добиться с помощью встроенной защиты на уровне строк (RLS). Шаги приведены в: https://docs.microsoft.com/en-gb/power-bi/developer/embedded-row-level-security

В разделе «Моделирование» (в Power BI Desktop) выберите «Управление ролями».

  1. Выберите таблицу, по которой вы хотите выполнить фильтрацию, и введите выражение DAX для фильтрации, например [City State] = "Sparta".
  2. Дайте роли имя, скажем Спартанец, и добавьте любые другие нужные фильтры. Щелкните Сохранить. Вы можете выбрать «Просмотр как роли», чтобы обеспечить надлежащую фильтрацию данных.
  3. В коде измените запрос токена, включив в него имя пользователя, роль и набор данных. Вы можете изменить его с чего-то вроде var generateTokenRequestParameters = new GenerateTokenRequest(accessLevel: "view"); на что-то вроде var generateTokenRequestParameters = new GenerateTokenRequest("view", null, identities: new List<EffectiveIdentity> { new EffectiveIdentity(username: "Spartacus", roles: new List<string> { "Spartan" }, datasets: new List<string> { "datasetId" }) });.

Обратите внимание, что необходимо указать имя пользователя, роли и набор данных.

Используя этот подход, даже если пользователь действительно манипулирует JavaScript, чтобы получить отчет в режиме редактирования, он не сможет получить доступ к данным, отфильтрованным вашими операторами DAX.

person RBreuer    schedule 05.11.2018
comment
Это правда, но меня больше беспокоит то, что базовые данные становятся видимыми с помощью функции редактирования. Я хотел бы создать несколько отчетов из одного общего набора данных, который я фильтрую (по клиенту, пользователю и т. Д.). Тогда любые изменения в модели данных нужно будет внести только один раз. Это также более эффективно с пространством. Но если пользователь может легко редактировать JavaScript и изменять фильтры, то реальной защиты данных нет. - person rudivonstaden; 06.11.2018
comment
Вы можете обеспечить защиту данных, используя Row-Level-Security по пользователю, вместо обычных фильтров ... Таким образом, пользователь будет видеть только те данные, которые ему доступны, независимо от «взлома» JS для их просмотра. - person RBreuer; 06.11.2018
comment
Несколько моментов из моего тестирования: (1) нет необходимости заранее определять имя пользователя (я предполагаю, что оно где-то зарегистрировано), (2) роли определены для набора данных, а не для отчета, поэтому любые новые отчеты, которые впоследствии создаются использование того же набора данных в качестве источника может автоматически применять те же роли. - person rudivonstaden; 06.11.2018