关于报告服务:如何使用SSRS中的自定义代码解决System.Security.SecurityException?

关于报告服务:如何使用SSRS中的自定义代码解决System.Security.SecurityException?

How do I resolve a System.Security.SecurityException with custom code in SSRS?

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

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

System.Security.SecurityException:
Request for the permission of type
'System.Security.Permissions.SecurityPermission,
mscorlib, Version=2.0.0.0,
Culture=neutral,
PublicKeyToken=b77a5c561934e089'
failed. at
System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken
permToken, CodeAccessPermission
demand, StackCrawlMark& stackMark,
Int32 unrestrictedOverride, Int32
create) at
System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission
cap, StackCrawlMark& stackMark) at
System.Security.CodeAccessPermission.Assert()
at [Snipped Method Name] at
ReportExprHostImpl.CustomCodeProxy.[Snipped Method Name] The action that failed was:
Demand The type of the first
permission that failed was:
System.Security.Permissions.SecurityPermission
The Zone of the assembly that failed
was: MyComputer

这个项目是我继承的,我对此并不十分熟悉。尽管我确实有代码(现在),所以我至少可以使用它:)

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

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

但是,这种东西也无处不在:

1
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

我可以看到这两种报表服务都不是开箱即用的内容。


1
2
3
4
5
<system.web>

<trust level="Full"/>

</system.web>

在web.config

中尝试


这是我解决问题的方法:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
                        <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。


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

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


以管理员模式运行服务


推荐阅读