如何修改Azure SQL数据集以支持Effective Identity实现RLS
解决App Owns Data嵌入时RLS无法启用的问题
你遇到的"此复选框已禁用,因为当前报表不支持提供有效用户名"提示,核心原因是你的数据集配置没有满足App Owns Data模式下传递Effective Identity的要求——虽然Desktop里RLS能正常工作,但服务端的数据源配置、RLS设置还需要调整。下面是具体的解决步骤:
1. 先确认RLS角色的定义逻辑
既然你在Desktop里能按角色查看报表,说明RLS的筛选逻辑本身没问题,但要确保角色规则是基于用户身份函数写的,这样才能和嵌入时传递的Effective Identity关联:
- 打开Power BI Desktop,进入「建模」→「管理角色」
- 检查每个角色的筛选条件,必须使用
USERPRINCIPALNAME()(返回用户邮箱)或USERNAME()(返回用户名)函数,比如:[UserEmailColumn] = USERPRINCIPALNAME() - 保存后重新发布数据集到Power BI服务。
2. 针对Azure SQL DB数据源的配置调整
根据你用的是DirectQuery还是导入模式,分两种情况处理:
情况A:使用DirectQuery连接Azure SQL DB
这是最常见的需要传递身份的场景,必须确保数据源支持Azure AD身份验证:
- 登录Power BI服务,找到你的数据集,进入「设置」→「数据源连接」
- 把身份验证方式改成Azure Active Directory - Service Principal或Azure AD Integrated(绝对不能用SQL Server身份验证,否则无法传递用户身份)
- 确保你的App Owns Data应用(Service Principal)拥有两个关键权限:
- 在Azure SQL DB中至少有
Reader权限 - 在Azure AD中拥有
Directory Readers权限(用于读取嵌入用户的身份信息)
- 在Azure SQL DB中至少有
- 回到数据集的「RLS」设置页,此时「允许嵌入用户查看此数据集的RLS筛选数据」复选框应该可以正常勾选了。
情况B:使用导入模式
导入模式下RLS是在Power BI数据集内部处理的,不需要传递身份到SQL DB,但需要开启服务端的支持:
- 在Power BI服务的数据集「RLS」设置页,勾选允许应用使用Effective Identity访问此数据集
- 在你的嵌入代码中,必须明确传递
EffectiveIdentity参数。比如用.NET SDK时:var tokenRequest = new GenerateTokenRequest( accessLevel: "view", effectiveIdentity: new EffectiveIdentity( username: "user@yourdomain.com", roles: new List<string> { "你的RLS角色名" } ) );
3. 最后检查工作区权限
- 确保你的App Owns Data应用在对应的Power BI工作区中是「成员」或「管理员」身份
- 确认数据集的权限设置中,应用拥有「读取」权限
完成这些配置后,再尝试嵌入时就能正常启用RLS并传递Effective Identity了。
内容的提问来源于stack exchange,提问作者Sartorialist
相关产品推荐
相关产品推荐

