我在报告服务中运行的交付扩展名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()还恢复了堆栈步行的权限,但由于编译器无法在上下文中获取安全描述符,因此它行不通。

一些进一步的阅读:使用堆栈步行修饰符编程

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top