【发布时间】:2014-02-10 20:47:18
【问题描述】:
我正在为 SSRS 构建一个轻量级 Web 界面,其中 Web 应用程序用户被映射到 Web 应用程序角色,而 Web 应用程序角色又被映射到 SSRS 用户。
这种复杂方案的原因是没有争议的:简而言之,不能使用 AD 组,该站点使用 Forms auth 并且有固定数量的角色。
Web Role | SSRS User
Admin | AdminUser
Supervisor | SuperUser
User | BasicUser
Guest | GuestUser
目标是枚举用户有权查看的所有报表,并允许用户使用 ReportViewer 控件查看报表。
更重要的是,它简化了用户(包括管理员和其他用户)的用户体验:防止管理员必须使用 Report Manager 网站(即,选择复选框而不是手动键入哪些 web-role-user 可以访问报告),并提供一个简单的用户界面,用户可以从中查看和执行他们的所有报告。
当用户是 AdminUser 时一切正常。
但是,当用户未包含在 Home/Root 文件夹的策略中且至少具有浏览器 SSRS 角色时,我很难调用 Web 服务。 (授予用户 'computer\username' 的权限不足以执行此操作。)
这有几个原因:
- 如果每个用户都必须是浏览器才能连接到 Web 服务并枚举他们有权查看/执行的报告,则默认情况下所有用户都可以访问所有新报告/文件夹。 (孩子自动继承新的权限)
- 如果报表存在于不继承权限的嵌套文件夹中,并且用户不是嵌套报表的浏览器,但用户是嵌套报表上的浏览器,
ListChildren()将不会返回该报表。
这似乎给我留下了 2 个不太理想的选项:
- 不要使用不同的用户调用 Web 服务。相反,仅使用管理员用户使用
ListChildren()枚举报告。然后,对于每个报告,请致电GetPolicies(),并从该策略集合中确定用户可以查看哪些报告。 - 与不同的用户进行通话。忍受默认情况下每个人都可以访问新发布的报告的缺陷,直到权限发生变化。除非用户有权访问该路径,否则不会显示嵌套报告的缺陷。如果管理员希望某个文件夹中的嵌套报表能够提供给看不到该文件夹的用户,则必须修改所有祖先文件夹及其子文件夹的策略。
#1 显然非常笨拙且效率低下。但是#2有很大的缺点,并且在某些情况下设置权限时变得繁琐且效率低下。
有没有更好的方法?我错过了什么明显的东西吗?
[编辑]
第三种选择是使用查询like this 直接查询 ReportServer 数据库。这样做的好处是返回用户有权访问的所有内容,无论它是否存在于用户无法访问的子文件夹中(也就是无法使用 Web 服务的 ListChildren 方法来检索)。但是,如果使用 AD 组,我必须知道用户属于哪些组,而 Web 服务会为我执行此操作。这个选项对我来说有点像黑客,但它可以工作。
事实证明,我们通过放弃限制通过 Web 角色访问报告的要求来解决此问题,并将我们在 Web 服务中查询的路径设置为可以更改的 web.config 设置,从而允许如果将来需要,报告作者可以将报告“隐藏”在父文件夹中。
【问题讨论】:
-
您是否将 SSRS 配置为使用表单身份验证,或者您的“SSRS 用户”AD 帐户?
-
他们实际上是 AD 帐户(本地 Windows 用户)
-
是否可以将 SSRS 配置为使用表单身份验证,连接到您现有的用户数据库以获得其凭证池?您大概还可以桥接您在其他系统中拥有的任何基于角色的安全规则。
-
这不是一个选项。但这仍然不会真正改变任何事情。主要问题是使用 recursive = true 调用 ListChildren 不会遍历所有目录来查找用户有权访问的报告,即使用户无法访问它所在的文件夹。 (不过,如果我们不再需要包装 SSRS,这可能是一个有争议的问题,这将是理想的。)
标签: web-services security reporting-services report