1

У меня есть расширение доставки внутри Reporting Service 2008.Безопасность доступа к коду в службах Reporting Services 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 специфический код в сборке ссылочного от внутренней линии поставки. В этой сборке был определен специальный код разрешения, но я попытался переместить его в сборку Delivery Extension - но не повезло.

ответ

0

В момент, когда вы пытаетесь изменить разрешения доступа, которые вы, возможно, уже унаследовали от более высокого уровня, или, возможно, вы сделали это где-то до того момента, когда вы находитесь.

Например, мы имеем такой код:

SqlClientPermission sqlClientPermission = new SqlClientPermission(PermissionState.Unrestricted); 
sqlClientPermission.Assert(); 

SecurityPermission securityPermission = new SecurityPermission(PermissionState.Unrestricted); 
securityPermission.Assert(); 

Мы будем иметь исключение, как ваша.

1

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(); 

еще несколько вещей, чтобы принять во внимание то, что это в большинстве случаев не требуется, чтобы объект в стек блуждания, так утверждают может быть упрощена до одной строки, е.

System.Security.Permissions.SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted).Assert(); 

Если вы изменяли стека, гуляют в способе инкапсулирования, внутренний стек будет , вероятно, не быть в состоянии изменить модификаторы снова. Ex.

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(); 
} 

Даже если UseSecurityPermission() возвращается разрешение на стек ходить, он не будет работать, потому что компилятор не может получить дескриптор безопасности в контексте.

Дополнительная информация: Programming with Stack-Walk Modifiers