Безопасная фильтрация в Power BI Embedded

В настоящее время у меня следующий сценарий. У меня есть отчет в Power BI, который читает из набора данных, в котором есть данные всех компаний. В моем приложении ASP .NET MVC пользователь выберет компанию, для которой будет отображаться отчет, а с Power BI Embedded приложение фильтрует отчет по идентификатору компании с помощью встроенной конфигурации, определенной в JS (параметры фильтра, передаваемые с сервера).

Я использую подход с использованием данных, принадлежащих приложению, где у меня есть основная учетная запись, а для основной учетной записи создается встроенный токен. Пользователь, обращающийся к отчету, не имеет прав доступа ко всем компаниям, и это обрабатывается на стороне сервера. Однако при таком подходе пользователь может легко изменить конфигурацию встраивания в JS и отобразить отчет для компании, к которой у него нет прав доступа.

Я изучил безопасность на уровне строк и нашел следующий подход https://community.powerbi.com/t5/Developer/PowerBi-Embedded-API-Works-with-RLS/td-p/231064, где для каждой компании есть роль. и встраиваемый токен создается для этой конкретной компании. Это был бы идеальный подход, но в моем сценарии компании не определены заранее и могут быть созданы в любое время. Следовательно, мне нужно будет создать роль для каждой компании. Однако этого нельзя достичь программно, поскольку Power BI не предоставляет средств для автоматизации создания ролей.

Единственный подход, который я могу придумать, - это клонировать отчет для каждой новой компании и создать набор данных, специфичный для этого отчета, который будет содержать данные только для этой конкретной компании. Тогда сгенерированный встроенный токен будет действителен только для этого конкретного отчета.

Кто-нибудь тоже испытывал эту дилемму? Есть предложения, что мне делать в таком сценарии?


person anonuser1    schedule 16.12.2019    source источник


Ответы (1)


Вы по-прежнему можете использовать RLS, но без ролей для каждой компании. Используйте функцию DAX USERPRINCIPALNAME (), чтобы узнать, какой пользователь просматривает отчет. В базе данных создайте таблицу, в которой укажите, какую компанию может видеть какой пользователь, и добавьте ее в свою модель. Затем используйте RLS, чтобы отфильтровать эту таблицу только до строки (или строк), в которой пользователь является текущим (здесь вступает в игру USERPRINCIPALNAME ()), и позвольте связи между этой таблицей и вашими таблицами данных отфильтровать то, что не должно быть видимый. Таким образом, никаких фильтров JavaScript не будет, и злоумышленник ничего не сможет изменить.

См. Использование функции DAX username () или userprincipalname ().

person Andrey Nikolov    schedule 16.12.2019
comment
Спасибо за ответ. Могу ли я по-прежнему использовать этот подход, поскольку я использую подход App Owns Data, а токен, который я генерирую, генерируется основной учетной записью? Будет ли Power BI Embedded автоматически распознавать пользователя, если я использую упомянутую функцию DAX, или мне нужно будет передать некоторые параметры при создании токена? - person anonuser1; 16.12.2019
comment
Да, потому что вы используете встроенные токены и можете указать личность пользователя при его создании. - person Andrey Nikolov; 16.12.2019
comment
Вот как передать удостоверение при создании токена - Создать отчет EmbedToken с помощью EffectiveIdentity - person Andrey Nikolov; 16.12.2019