Power BI Embedded(App Owns Data)Azure AS实时连接RLS实现及CustomData()咨询
当然可以!用CustomData()函数完全能实现你要的这种基于用户上下文的RLS数据筛选,我来给你一步步拆解实现流程:
实现指导:用CustomData()在Azure AS中实现RLS(Power BI Embedded App Owns Data场景)
首先明确:你完全可以通过CustomData()函数读取传递到Azure AS的安全上下文值,进而实现RLS数据筛选,这是这类场景下非常常用的方案。下面是具体的实现步骤:
1. 在Azure Analysis Service中配置RLS角色
打开SQL Server Management Studio(SSMS)连接到你的Azure AS实例,右键模型 -> 角色 -> 新建角色:
- 给角色命名(比如
UserContextFilterRole),设置权限为“读取” - 切换到行筛选器标签,针对需要限制的表编写筛选规则:
- 如果只传单个值(比如
customer_id),直接写:Customer[CustomerID] = CustomData() - 如果需要传递多个值(比如
customer_id和service_id),先把值用分隔符(比如|)拼接成字符串传递,然后用DAX函数拆分:Customer[CustomerID] = PATHITEM(CustomData(), 1) && Service[ServiceID] = PATHITEM(CustomData(), 2)
提示:如果字段是数字类型,记得用
VALUE()转换,比如Customer[CustomerID] = VALUE(PATHITEM(CustomData(), 1)) - 如果只传单个值(比如
2. 在Power BI Embedded代码中传递CustomData值
在你的App Owns Data应用中,生成嵌入令牌时,需要把用户的安全上下文值传递给CustomData属性:
- 如果你用.NET SDK:
var embedConfig = new EmbedConfig { // 其他配置项... CustomData = $"{customerId}|{serviceId}" // 拼接你的上下文值 }; // 生成嵌入令牌时包含这个CustomData var tokenRequest = new GenerateTokenRequestV2( datasets: new List<GenerateTokenRequestDataset> { new GenerateTokenRequestDataset { Id = datasetId } }, customData: embedConfig.CustomData ); - 如果你用REST API:
在GenerateToken请求的body里加入customData字段:{ "datasets": [{"id": "your-dataset-id"}], "customData": "customer123|service456" }
3. 验证RLS效果
- 在AS端测试:在SSMS中右键你的角色 -> 测试角色,在弹出的窗口中设置
CustomData为你要测试的值,点击确定后查看表数据,确认筛选是否生效。 - 在应用端测试:模拟不同用户登录,传递不同的
customer_id/service_id,查看嵌入的Power BI报表是否只显示对应权限的数据。
注意事项
- 确保Power BI Embedded的服务主体(或嵌入身份)拥有Azure AS实例的“读取”权限,并且被添加到你创建的RLS角色中。
- CustomData是字符串类型,传递时要注意值的格式,避免分隔符冲突(如果值本身包含分隔符,建议用更特殊的符号比如
|||或者URL编码)。 - 若需要更复杂的上下文传递,也可以考虑使用
UserName()函数,但CustomData在多参数场景下更灵活。
内容的提问来源于stack exchange,提问作者Srinu
相关产品推荐
相关产品推荐

