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

Ian*_*son 13 securityexception reporting-services

我已经在Reporting Services报告中创建了一个程序集并引用了它.我已经在本地(工作)测试了报告,然后我将报告上传到报告服务器(不起作用).

这是我编写的自定义代码引发的错误.

System.Security.SecurityException:对类型'System.Security.Permissions.SecurityPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的权限的请求失败.at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken,CodeAccessPermission demand,StackCrawlMark&stackMark,Int32 unrestrictedOverride,Int32 create),位于System.Security.CodeAccessPermission.Assert()处的System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap,StackCrawlMark和stackMark)处. [Snipped Method Name]在ReportExprHostImpl.CustomCodeProxy.[Snipped Method Name]失败的操作是:Demand失败的第一个权限的类型是:System.Security.Permissions.SecurityPermission失败的程序集区域是:

这个项目是我继承的,我对它并不熟悉.虽然我有代码(现在),所以我至少可以使用它:)

我相信失败的代码是这样的:

    Dim fio As System.Security.Permissions.FileIOPermission = New System.Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted)
    fio.Assert()
Run Code Online (Sandbox Code Playgroud)

但是,这种东西到处都是:

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
Run Code Online (Sandbox Code Playgroud)

我可以看到其中任何一个都是Reporting Services无法开箱即用的东西.

小智 18

<system.web>

<trust level="Full"/>

</system.web>
Run Code Online (Sandbox Code Playgroud)

在web.config中尝试这个


Ian*_*son 8

这就是我能够解决问题的方法:

  • 强烈签署有问题的自定义程序集
  • 修改rssrvpolicy.config文件以添加程序集的权限

                        <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>
    
    Run Code Online (Sandbox Code Playgroud)

旁注:这是获取程序集的公钥blob的一种很好的方法, 用于获取签名程序集的公钥标记和blob.