使用自定义安全扩展在SSRS中错误订阅传递

时间:2013-10-09 12:11:44

标签: c# reporting-services permissions customization

我开发了一个自定义安全扩展,以便从我们的Intranet产品到报告服务进行单点登录。在我订阅之前,它就像一个魅力。

开发确实像这里建议的那样: http://msdn.microsoft.com/en-us/library/ms155029.aspx

登录,上传和管理报告有效。每个用户都可以阅读和打开报告。 我们还实现了授权并覆盖了这里描述的功能: http://msdn.microsoft.com/en-us/library/ms152800.aspx

管理文件夹,报告也可以。

当我订阅呈现报告以通过电子邮件发送报告时,系统会说用户没有足够的权限通过电子邮件发送报告。

notification!WindowsService_0!1674!10/09/2013-14:02:04:: i INFO: Handling subscription f70f374e-28fa-4ba2-8b0e-6633f1299ee9 to report Projekt Aufwand, owner: rausch, delivery extension: Report Server Email.
library!WindowsService_0!1674!10/09/2013-14:02:04:: i INFO: RenderForNewSession('/Projektverwaltung/Projekt Aufwand')
library!WindowsService_0!1674!10/09/2013-14:02:04:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.AccessDeniedException: , Microsoft.ReportingServices.Diagnostics.Utilities.AccessDeniedException: Die dem Benutzer 'rausch' erteilten Berechtigungen reichen zum Ausführen des Vorgangs nicht aus.;
library!WindowsService_0!1674!10/09/2013-14:02:04:: i INFO: Initializing EnableExecutionLogging to 'True'  as specified in Server system properties.
emailextension!WindowsService_0!1674!10/09/2013-14:02:04:: e ERROR: Error sending email. Exception: Microsoft.ReportingServices.Diagnostics.Utilities.RSException: Die dem Benutzer 'rausch' erteilten Berechtigungen reichen zum Ausführen des Vorgangs nicht aus. ---> Microsoft.ReportingServices.Diagnostics.Utilities.AccessDeniedException: Die dem Benutzer 'rausch' erteilten Berechtigungen reichen zum Ausführen des Vorgangs nicht aus.
notification!WindowsService_0!1674!10/09/2013-14:02:04:: i INFO: Notification 6241f7f4-6225-44ea-b8ff-3654960ae218 completed.  Success: True, Status: Fehler beim Senden von E-Mail: Die dem Benutzer 'rausch' erteilten Berechtigungen reichen zum Ausführen des Vorgangs nicht aus.E-Mails werden nicht erneut gesendet., DeliveryExtension: Report Server Email, Report: Projekt Aufwand, Attempt 0

解决方法:我打开ReportServer数据库中的subscriptions表,并将OwnerId UserId替换为报表服务器管理员的userId。然后订阅在管理员权限下运行,它可以工作。

任何人都知道我可以在哪里查看/检查以设置正确的权限?或者我必须在CheckAccess覆盖方法中添加一些代码吗?

部分代码:

  m_RptOperNames.Add(ReportOperation.CreateSubscription,
      OperationNames.OperCreateSubscription);
  m_RptOperNames.Add(ReportOperation.DeleteSubscription,
      OperationNames.OperDeleteSubscription);
  m_RptOperNames.Add(ReportOperation.ReadSubscription,
      OperationNames.OperReadSubscription);
  m_RptOperNames.Add(ReportOperation.UpdateSubscription,
      OperationNames.OperUpdateSubscription);
  m_RptOperNames.Add(ReportOperation.CreateAnySubscription,
      OperationNames.OperCreateAnySubscription);
  m_RptOperNames.Add(ReportOperation.DeleteAnySubscription,
      OperationNames.OperDeleteAnySubscription);
  m_RptOperNames.Add(ReportOperation.ReadAnySubscription,
      OperationNames.OperReadAnySubscription);
  m_RptOperNames.Add(ReportOperation.UpdateAnySubscription,
      OperationNames.OperUpdateAnySubscription);

在这里,我移动了整个c#类代码进行调查:https://docs.google.com/file/d/0B02JCr49NYlUeDFVbWt2NVdpUmc/edit?usp=sharing

我没有看到任何执行或电子邮件订阅,但它不是参考代码的一部分。可能是这样吗?

修改

看到这个:http://msdn.microsoft.com/en-us/library/bb283182.aspx 任何人都可以告诉我通过电子邮件订阅需要什么项目权利?然后我可以更深入地了解项目需要被授予的内容。

更新

我仍然有这个问题,但我现在有点明智了:)。 事实上,电子邮件传递由Microsoft.ReportingServices.Library.TimedSubscriptionHandler处理,由WindowsService Reportserver使用。

如果您使用指向报告的链接设置订阅,则订阅仅适用于CustomSecurity扩展程序! 添加报告使系统呈现报告。报表服务器在那里创建一个新会话,并且不授予权限。我还不知道自定义安全扩展的继承是否在这里工作。

也许某些SSRS / .NET大师有一些提示,几个小时的网络没有给我任何解决方案。

解决方法:目前我在订阅上设置了触发器,并将AdminI替换为Admin ID。

CREATE TRIGGER Subscription_overwrite_owner
   ON  dbo.Subscriptions
   AFTER INSERT, UPDATE
AS 
BEGIN
    -- replace the OwnerId with the uid from the admin account
    -- so the TimedSubscription runs with correct credentials
    UPDATE dbo.Subscriptions SET OwnerID = 'uuid admin from Users table'
END
GO

1 个答案:

答案 0 :(得分:3)

我更喜欢别人找到了答案,但是几个月来没有人我继续调查问题所在。最后,获胜者是......

没有评论我使用示例项目来实现自定义的seecurity扩展。

我让它适用于我的环境!

  1. 我确实设置了一个安全扩展,并对CustomSecurity进行了示例 项目
  2. 除了订阅外,一切正常,如果它们包含附件(如呈现的报告)。
  3. 我后来发现它适用于管理员用户设置 在rsreportserver.config(<Security><Configuration>中 从SetConfiguration设置加载。
  4. 示例项目告诉我们,我们存储了应用程序设置 web.config
  5. 我确实在web.config中存储了自定义安全扩展的许多参数!

    所有在前端工作正常并呈现报告。但是当涉及到附件的订阅时,我们会遇到权限错误......

    它与Administrator一起使用,因为如果用户是管理员,CustomSecurity Sample项目会授予访问权限。

    但是ReportServicesService.exe没有从web.config获取配置数据!

    这就是为什么我的所有CheckAccess()方法都无法检查其他安全设置,因为在我们存储的web.config中,例如如果我们用来获取自定义数据库的连接字符串。

    因此,您现在可以重写代码并将所有配置数据从web.config移动到rsreportserver.config文件中。

    或者您也可以将web.config应用程序添加到/bin/ReportingServicesService.exe.config。

    在我的情况下例如:

    <configuration>
      <configSections>
        <section name="RStrace" type="Microsoft.ReportingServices.Diagnostics.RSTraceSectionHandler,Microsoft.ReportingServices.Diagnostics" />
        <!-- custom authentication start -->
        <section name="CustomSecurity" requirePermission="false" />
        <!-- custom authentication end -->
      </configSections>
      <!-- custom authentication start -->
      <appSettings>
        <add key="log" value="d:\log"/>
        <add key="multi_company" value="true"/>
        <add key="default_domain" value="fqdn.domain.de"/>
        <add key="connection" value="database=ReportServer;server=(local);uid=sa;pwd=secret;" />
      </appSettings>
      <!-- custom authentication end -->
    

    这不写在哪里,我花了一段时间来弄清楚......

    希望能帮助每个人使用自定义表单身份验证和SSRS。