如何在SSRS中使用自定义代码解决System.Security.SecurityException问题?

13

我创建了一个程序集并在我的报表服务报告中引用它。我在本地测试过报告(可用),然后将报告上传到报告服务器(不可用)。

以下是我编写的自定义代码抛出的错误消息:

 

System.Security.SecurityException:请求的权限类型 'System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089' 失败。    在 System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken,CodeAccessPermission demand,StackCrawlMark& stackMark,Int32 unrestrictedOverride,Int32 create)中失败。    在 System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap,StackCrawlMark& stackMark)中。    在 System.Security.CodeAccessPermission.Assert()中。    在 [剪切的方法名称] 中。    在 ReportExprHostImpl.CustomCodeProxy。[剪切的方法名称] 中。    失败的操作是:Demand。    第一个失败的权限类型是:System.Security.Permissions.SecurityPermission。    失败的程序集区域是:MyComputer

这个项目是我继承而来的,我对它不是非常熟悉。尽管我现在有了代码,所以至少可以使用它 :)

我认为失败的代码是这段:

    Dim fio As System.Security.Permissions.FileIOPermission = New System.Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted)
    fio.Assert()

然而,这种东西也无处不在:

Private Declare Function CryptHashData Lib "advapi32.dll" (ByVal hhash As Integer, ByVal pbData As String, ByVal dwDataLen As Integer, ByVal dwFlags As Integer) As Integer

我可以看到这些都是Reporting Services默认情况下无法适应的事情。


这可能会对你有所帮助:http://blogs.msdn.com/shawnfa/archive/2003/06/20/57023.aspx - John Smithers
4个回答

18
<system.web>

<trust level="Full"/>

</system.web>

在web.config中尝试这个


9
这是我解决问题的方法:
  • strongly sign the custom assembly in question
  • modify the rssrvpolicy.config file to add permissions for the assembly

                        <CodeGroup
                            class="UnionCodeGroup"
                            version="1"
                            PermissionSetName="FullTrust"
                            Name="Test"
                            Description="This code group grants the Test code full trust. ">
                            <IMembershipCondition
                                    class="StrongNameMembershipCondition"
                                    version="1"
                                    PublicKeyBlob="0024000004800000940100000602000000240000575341310004000001000100ab4b135615ca6dfd586aa0c5807b3e07fa7a02b3f376c131e0442607de792a346e64710e82c833b42c672680732f16193ba90b2819a77fa22ac6d41559724b9c253358614c270c651fad5afe9a0f8cbd1e5e79f35e0f04cb3e3b020162ac86f633cf0d205263280e3400d1a5b5781bf6bd12f97917dcdde3c8d03ee61ccba2c0"
                                />
                        </CodeGroup>
    

顺带一提:这里有一个很好的方法可以获取您程序集的公钥Blob:使用VS的技巧来获取已签名程序集的公钥令牌和Blob


有没有样例 PowerShell 脚本 ps1 来修改 rssrvpolicy.config?谢谢。 - Kiquenet

0
 <CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="FullTrust">

对我来说,解决方案是更改 rssrvpolicy.config 中的上述行,将 "None" 更改为 "FullTrust"

0

以管理员模式运行您的服务


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接