Безопасность доступа к коду в службах Reporting Services 2008 - PullRequest
1 голос
/ 26 мая 2010

У меня есть модуль доставки, работающий внутри Reporting Service 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, находится в сборке, на которую ссылается Расширение доставки. Специальный код разрешения находился внутри этой сборки, но я попытался переместить его в сборку расширения поставки - но без всякой удачи.

Ответы [ 2 ]

1 голос
/ 10 января 2017

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 () отменяет разрешение на просмотр стека, оно не будет работать, поскольку компилятор не может получить дескриптор безопасности в контексте.

Некоторое дальнейшее чтение: Программирование с помощью модификаторов Stack-Walk

0 голосов
/ 31 июля 2010

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

Например, у нас есть такой код:

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

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

У нас будет исключение, подобное вашему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...