【问题标题】:How to pass parameter from Asp.net application to Power BI如何将参数从 Asp.net 应用程序传递到 Power BI
【发布时间】:2019-12-04 19:00:57
【问题描述】:

我们在 asp.net mvc 中设计了多租户 Web 应用程序。我们的数据库存储在 Azure 上。我们在数据库中创建了安全策略,因此没有客户端可以看到另一个客户端的数据,并且在每个表中我们都有每个条目的租户 ID。

我们使用 power bi 创建了一些仪表板,使用具有租户 id 参数的 sql 存储过程访问数据。出于测试目的,我在 power bi 桌面内运行仪表板时提供租户 ID。现在我们正在尝试将这些仪表板集成到我们的 Web 应用程序中。为此,我们在 web.config 文件中进行了必要的更改。

问题是我们将如何提供登录到 power bi 的用户的tenantID,以便用户只能查看该特定客户端的数据?

提前致谢。

【问题讨论】:

    标签: stored-procedures powerbi azure-sql-database multi-tenant powerbi-desktop


    【解决方案1】:

    这取决于您的报告(导入或 DirectQuery)的 storage mode 以及它将如何集成到您的应用中(Embedded APIPublish to web (public)Secure embed)。

    如果存储模式为Imported,这意味着您的报告包含数据的副本。结果是您无法查询数据库并根据当前用户获取数据,因为数据的副本是一份,并且与正在查看您的报告的所有用户共享。因此数据应该适用于所有租户,并且您必须在每个用户会话中对其进行过滤。可以通过两种方式进行过滤 - 通过添加“正常”报告级别过滤器或通过实现 Row-level security (RLS)

    过滤可以通过passing the filter in the URLdefining the filter in the embedded configuration来实现。第一个可以与 Secure embed 一起使用,而后者在使用 Embedded API 时适用。请注意,Publish to web 方法不支持 URL 过滤器。重要的是,以这种方式添加的过滤器将在Filters pane 中可见,用户可以修改或删除它(因此这不是保护数据的好方法)。如果您使用 API 嵌入报表,则可以通过在 embed config 中设置 filterPaneEnabled: false 来隐藏“过滤器”窗格,但这也会隐藏所有其他过滤器,最终用户将能够仅使用视觉对象对数据进行切片由您提供(例如报告中的切片器)。另请注意,安全嵌入要求报表的每个查看者都拥有 Power BI Pro 许可证 (或者,如果您发布报告的工作区分配了专用容量,即 Power BI PremiumPower BI Embedded,Power BI 免费许可证)。

    使用 RLS,您将在报表中包含所有租户的所有数据,Power BI 将为您过滤它,因此用户将只能看到与其租户相关的数据。这可以通过两种方式实现 - 为每个租户定义一个角色并将您的最终用户包含在相应的角色中,或者在您的报告中使用use userprincipalname() DAX 函数来根据当前用户过滤数据。

    我的建议是使用 RLS,在这种情况下的好处是可以嵌入单个报告,并且根本不需要从您的应用程序向其传递任何参数。

    【讨论】:

    • 您好安德烈,感谢您的快速回复。问题是我们的数据库启用了安全策略,因此没有一个客户端可以看到其他客户端的数据。当我们想要执行任何脚本时,我们必须为我们想要查看数据的特定客户端设置会话上下文。现在在这种情况下,在获取数据时在 power bi 中传递查询时,我们需要传递客户端 ID,以便我们可以获取该客户端 ID 的数据。如果我在运行查询时没有设置会话上下文,它将不返回任何结果。所以在 PowerBI 中直接查询我们必须传递 clientId。
    • 你是如何设置这个会话上下文的?
    • 当我们想查看脚本 EXEC sp_set_session_context @key=N'OwnerID', @value=@OwnerID; 的结果时,我们在 sql 中执行此语句在这个@OwnerID 是我们想要查看数据的客户端的ID。
    • 这是自定义实现,Power BI 无法直接使用。即使您设法将应用程序中的OwnerID 值传递给报告,它也会在与报告的每次交互中一遍又一遍地重新执行存储过程,这至少是低效的。通过这种实施,最好的解决方案是为每个租户创建一个单独的报告副本,您将在其中导入从此存储过程返回的数据,并根据当前用户,在您的应用程序中嵌入适当的报告。
    • 哦,那不好。你能解释一下为什么存储过程会一次又一次地执行吗?这将非常有帮助。您是否建议每个所有者重新执行存储过程?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多