Безопасность доступа кода в службах отчетности 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, находится в сборке, на который ссылается на расширение доставки. Конкретный код разрешений был внутри этого сборки, но я попытался переместить его в усадку доставки, но WOTHOUT любой удачи.
Решение
В точке вы пытаетесь изменить разрешения доступа, вы, возможно, уже унаследовали его от более высокого уровня, или, возможно, вы сделали его где-то до того, как вы находитесь.
Например, у нас есть код так:
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();
Некоторые еще предприняты во внимание, что в основном он не требуется держать объект к прогулке стека, поэтому 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();
}
Несмотря на то, что INESEESTURITERPERMISSY () возвращает разрешение на прогулку стека, он не будет работать, потому что компилятор не может получить дескриптор безопасности в контексте.
Некоторые дальше чтения:Программирование со стеком-модификаторами