如何使用 SSRS 中的自定义代码解决 System.Security.SecurityException?
-
09-06-2019 - |
题
我创建了一个程序集并在我的 Reporting Services 报告中引用了它。我已在本地测试了报告(有效),然后将报告上传到报告服务器(无效)。
这是我编写的自定义代码引发的错误。
系统.安全.安全异常:请求允许类型'System.Security.permissions.securitypermission,Mscorlib,版本= 2.0.0.0,Culture = Neutral,publicKeyToken = B77A5C561934E089'失败。于 System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken) permToken, CodeAccessPermission 需求,StackCrawlMark& stackMark、 Int32 unrestrictedOverride, Int32 在 System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission) cap, StackCrawlMark& stackMark) at System.Security.CodeAccessPermission.Assert() 在[截取的方法名称]处 ReportExprHostImpl.CustomCodeProxy.ReportExprHostImpl.CustomCodeProxy.ReportExprHostImpl.CustomCodeProxy:需求 第一个 失败的许可是System.Security.Permissions.SecurityPermission 装配失败的区域 是我的电脑
这个项目是我继承的,我对它不是很熟悉。虽然我确实有代码(现在),所以我至少可以使用它:)
我相信失败的代码是这样的:
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 无法立即提供这些内容。
解决方案 2
这就是我解决问题的方法:
- 对有问题的自定义程序集进行强烈签名
修改 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 的好方法获取签名程序集的公钥令牌和 blob 的 VS 技巧.
其他提示
<system.web>
<trust level="Full"/>
</system.web>
在 web.config 中尝试这个
以管理员模式运行您的服务
<CodeGroup class="FirstMatchCodeGroup" version="1" PermissionSetName="FullTrust">
对我来说,解决方案是更改上面的行 rssrvpolicy.config
从 "None"
到 "FullTrust"
.