如何使用SSRS中的自定义代码解决System.Security.SecurityException?
时间:2020-03-05 18:44:25 来源:igfitidea点击:
我已经创建了一个程序集,并在我的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
这个项目是我继承的,我对此并不十分熟悉。尽管我确实有代码(现在),所以我至少可以使用它:)
我相信失败的代码是这样的:
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无法立即使用的。
解决方案
回答
这就是我能够解决此问题的方式:
- 强烈签名有问题的自定义程序集
- 修改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>
旁注:这是获取程序集中公钥blob的好方法
VS技巧,用于获取已签名程序集的公钥令牌和Blob。