Поделиться через


Частично доверенный вызывающий код

При интеграции со средой CLR часто реализуется общий доступ к программным библиотекам, когда к сборке, которая содержит определяемый пользователем тип, хранимую процедуру, определяемую пользователем функцию, определяемую пользователем статистическую функцию, триггер или служебный класс, получают доступ другие сборки и приложения. Библиотеки кода, к которым осуществляется общий доступ нескольких приложений, должны быть подписана строгим именем.

Право доступа к общей сборке управляемого кода, не помеченной явно атрибутом System.Security.AllowPartiallyTrustedCallers, имеют только приложения с полным доверием со стороны системы управления доступом к коду во время выполнения. При попытке со стороны сборки с частичным доверием (зарегистрированной в СУБД SQL Server с набором разрешений SAFE или EXTERNAL_ACCESS) получить доступ к сборке со строгим именем без этого атрибута активизируется исключение System.Security.SecurityException. Отображается примерно следующее сообщение об ошибке.

Msg 6522, Level 16, State 1, Procedure usp_RSTest, Line 0
A .NET Framework error occurred during execution of user defined
routine or aggregate 'usp_RSTest':  System.Security.SecurityException: That assembly does not allow partially trusted callers.
System.Security.SecurityException: at
System.Security.CodeAccessSecurityEngine.ThrowSecurityException(
Assembly asm, PermissionSet granted,PermissionSet refused,
RuntimeMethodHandle rmh, SecurityAction action, Object demand,
IPermission permThatFailed) at
Microsoft.Samples.SqlServer.TestResultSet.Test()

Рекомендуется пометить все сборки, зарегистрированные в СУБД SQL Server, за исключением сборок, добавленных в глобальный кэш сборок атрибутом AllowPartiallyTrustedCallers, чтобы сборки, загруженные в SQL Server, могли получить доступ друг к другу. Сборки, которые добавляются в глобальный кэш сборок, должны быть тщательно проверены с точки зрения безопасности до того, как они будут помечены атрибутом AllowPartiallyTrustedCallers, так как после этого сборка будет доступна для вызовов с частичным доверием из непредвиденных контекстов. Ни одной сборке не следует присваивать полное доверие (регистрировать ее с набором разрешений UNSAFE в SQL Server).

Дополнительные сведения см. в разделе «Использование библиотек в частично доверенном коде» справочной документации пакета SDK для платформы .NET Framework.

Примеры

Предположим, что имеется служебный класс, который может применяться во многих серверных приложениях интеграции со средой CLR. В качестве примера можно указать класс, представляющий результаты вызова запроса. Чтобы можно было реализовать общий доступ к этому компоненту, служебный класс помещается в отдельную сборку. Затем ссылки на сборку помещаются во многие другие сборки, содержащие объекты интеграции со средой CLR. Таким образом, этот служебный класс используется в различных серверных приложениях, поэтому тщательно проверяется, а все возможные проблемы безопасности устраняются. Затем к сборке, содержащей служебный класс, применяется атрибут AllowPartiallyTrustedCallers, чтобы объекты интеграции со средой CLR, содержащиеся в сборках, помеченных как SAFE или EXTERNAL_ACCESS, могли использовать этот служебный класс и его методы, даже находясь в других сборках. Пример использования атрибута AllowPartiallyTrustedCallers можно найти в образце результирующего набора, доступном на сайте CodePlex; дополнительные сведения см. в разделе Образцы компонента SQL Server Database Engine.

См. также

Основные понятия