报告服务中的代码访问安全性2008
-
04-10-2019 - |
题
我在报告服务中运行的交付扩展名2008。
它已经运行了很长时间了。但是现在,我想从扩展程序内部插入数据库。
我遇到的第一个错误是:
Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Data.SqlClient.SqlClientPermission, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace: at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark& stackMark, Boolean isPermSet)
at System.Security.PermissionSet.Demand()
at System.Data.Common.DbConnectionOptions.DemandPermission()
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()
然后,我在打开连接并执行插入的代码之前添加了此内容:
SqlClientPermission sqlPermission = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
sqlPermission.Assert();
然后,错误消息更改为:
Exception: System.Security.SecurityException Exception Message: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed. Stacktrace: 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()
然后我添加了以下行:
SecurityPermission permission = new SecurityPermission(PermissionState.Unrestricted);
permission.Assert();
现在我得到的错误是:
Exception: System.Security.SecurityException Exception Message: Stack walk modifier must be reverted before another modification of the same type can be performed. Stacktrace: at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
at System.Security.CodeAccessPermission.Assert()
我的代码包含实际的SQLConnection特定代码位于从交付扩展程序中引用的汇编中。该组件内的特定代码在内部,但我尝试将其移至交付扩展程序组件中 - 但要运气。
解决方案
在您试图修改访问权限时,您可能已经从更高级别继承了它,或者也许您已经在要点之前的某个地方完成了此操作。
例如,我们有这样的代码:
SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();
SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();
我们将有像您这样的例外。
其他提示
User407428是正确的,试图启用两个不同的修饰符是导致您的问题的原因。最好的原则是允许对需要它的代码部分的权限,然后禁用许可后词。因此,当您需要下一个许可时,您可以再次修改这些权利。
SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted);
sqlClientPermission.Assert();
//<your code that requires SqlClientPermission here>
CodeAccessPermission.RevertAccess();
SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted);
securityPermission.Assert();
还有更多需要考虑的事情是,将对象保留到堆栈步行中,因此可以简化断言到单行EI。
System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
如果您在封装方法中修改了堆栈步行,则内部堆栈将 可能不是 能够再次修改修饰符。前任。
public void UseSecurityPermission()
{
CodeAccessPermission.RevertAssert();
new System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
<Some code that requires the SecurityPermission>
}
static void Main(string[] args)
{
new System.Security.Permissions.FileIOPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert();
//< Some code that requires IOPermission>
UseSecurityPermission();
}
即使usecuritypermission()还恢复了堆栈步行的权限,但由于编译器无法在上下文中获取安全描述符,因此它行不通。
一些进一步的阅读:使用堆栈步行修饰符编程
不隶属于 StackOverflow