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


Олицетворение и средства обеспечения безопасности при интеграции со средой CLR

При обращении управляемого кода к внешним ресурсам в SQL Server не выполняется автоматически олицетворение текущего контекста выполнения, в котором выполняется процедура. В коде сборок EXTERNAL_ACCESS и UNSAFE олицетворение текущего контекста выполнения может проводиться явно.

ПримечаниеПримечание

Дополнительные сведения об изменениях поведения при олицетворении см. в разделе Критические изменения в функциях компонента Database Engine в SQL Server 2008 R2.

Поставщик внутрипроцессного доступа к данным предоставляет прикладной программный интерфейс, SqlContext.WindowsIdentity, который может использоваться для получения токена, связанного с текущим контекстом безопасности. В управляемом коде сборок EXTERNAL_ACCESS и UNSAFE этот метод может использоваться для получения контекста, а метод WindowsIdentity.Impersonate платформы .NET Framework служит для олицетворения этого контекста. При проведении явного олицетворения в пользовательском коде применяются следующие ограничения.

  • Внутрипроцессный доступ к данным не допускается, если управляемый код находится в состоянии, прошедшем олицетворение. В коде можно выполнить откат олицетворения, а затем вызвать средства внутрипроцессного доступа к данным. Следует отметить, что для отката олицетворения требуется сохранить возвращаемое значение (объект WindowsImpersonationContext) исходного метода Impersonate и вызвать метод Undo применительно к этому контексту WindowsImpersonationContext.

    Это ограничение означает, что при осуществлении внутрипроцессного доступа к данным этот доступ всегда осуществляется в условиях применения текущего контекста безопасности, являющимся действительным для данного сеанса. Данные не могут быть изменены с помощью явного олицетворения в рамках управляемого кода.

  • Применительно к управляемому коду, выполняемому асинхронно (например, с помощью сборок UNSAFE, в которых создаются потоки и код выполняется асинхронно), внутрипроцессный доступ к данным ни в коем случае не разрешается. Это справедливо, независимо от наличия олицетворения.

Если код выполняется в олицетворенном контексте, отличном от контекста SQL Server, то в нем нельзя выполнять вызовы внутрипроцессного доступа к данным; в коде необходимо отменить контекст олицетворения перед выполнением вызовов внутрипроцессного доступа к данным. Если внутрипроцессный доступ к данным осуществляется из управляемого кода, то для авторизации всегда используется первоначальный контекст выполнения точки входа Transact-SQL в управляемый код.

Как сборки EXTERNAL_ACCESS, так и сборки UNSAFE получают доступ к ресурсам операционной системы с помощью учетной записи службы SQL Server, если в них не было специально применено олицетворение текущего контекста безопасности, как описано выше. В связи с этим требуется более высокий уровень доверия к авторам сборок EXTERNAL_ACCESS, чем к авторам сборок SAFE, что выражается в наличии разрешения EXTERNAL ACCESS на уровне имени входа. Только именам входа, которым доверено выполнение кода в рамках учетной записи службы SQL Server, должно быть предоставлено разрешение EXTERNAL ACCESS.