Избегать TRUSTWORTHY ON и PERMISSION_SET = UNSAFE с использованием System.Net.Http - PullRequest
0 голосов
/ 26 мая 2018

Попытка создать хранимую процедуру из библиотеки DLL, которую я построил для использования с SQL с использованием интеграции CLR.Я думаю, что мне нужна подписанная версия System.Net.Http и объяснить, почему ниже.Буду признателен за любые советы или советы.

Решение работает на 100%, если я использую команду

ALTER DATABASE test2 SET TRUSTWORTHY ON

Затем я создаю сборку, используя следующие команды

CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Net.Http\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;
GO 

CREATE ASSEMBLY [CLRTest01]
AUTHORIZATION dbo
FROM 'C:\Windows\CLRTest01.dll'
WITH PERMISSION_SET = UNSAFE;
GO 

Поскольку я предпочитаю доверять настройкам по умолчанию, я хотел бы иметь возможность сделать это без использования уровня разрешений «UNSAFE» и вместо этого использовать «SAFE».Однако, когда я пытаюсь сделать это для CLRTest01, который зависит от System.Net.Http, я сталкиваюсь с проблемой того, что мой System.Net.Http не подписан или имеет неправильный формат, кажется.

CREATE ASSEMBLY [System.Net.Http]
AUTHORIZATION dbo
FROM 'C:\Windows\System.Net.Http.dll'
WITH PERMISSION_SET = SAFE;
GO 

Ошибка при использовании v4.0_2.0.0.0__b03f5f7f11d50a3a - сборка «System.Net.Http» не может быть установлена, поскольку существующая политика не позволит использовать ее.

Ошибка при использовании v4.0_4.0.0.0__b03f5f7f11d50a3a- Не удалось создать CREATE ASSEMBLY, поскольку тип «System.Net.Http.HttpContent» в безопасной сборке «System.Net.Http» имеет статическое поле «EncodingsWithBom».Атрибуты статических полей в безопасных сборках должны быть помечены только для чтения в Visual C #, ReadOnly в Visual Basic или initonly в Visual C ++ и промежуточном языке.

Что заставляет меня думать, что мне нужна подписанная версия System.Net.Http .

1 Ответ

0 голосов
/ 26 мая 2018

Все библиотеки .NET Framework уже подписаны.Проблема заключается в том, что вам необходимо создать асимметричный ключ или сертификат в [master] из открытого ключа ключа строгого имени (SNK) или сертификата (CER), который использовался для подписи этой сборки (и часто сборкастрого именованные и , подписанные сертификатом).

Вы можете сделать следующее, чтобы избежать TRUSTWORTHY (, что абсолютно правильно сделать ):

USE [master];

CREATE CERTIFICATE [MS.NETcer]
FROM EXECUTABLE FILE =
   'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll';

CREATE LOGIN [MS.NETcer] FROM CERTIFICATE [MS.NETcer];

GRANT UNSAFE ASSEMBLY TO [MS.NETcer];

Тогда вы можете сделать это:

USE [SomeDatabase];

CREATE ASSEMBLY [System.Net.Http]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;

Кроме того, вы не сможете использовать PERMISSION_SET = SAFE с System.Net.Http из-засообщение об ошибке, которое вы отправили:

тип 'System.Net.Http.HttpContent' в безопасной сборке 'System.Net.Http' имеет статическое поле 'EncodingsWithBom'.Атрибуты статических полей в безопасных сборках должны быть помечены только для чтения в Visual C #, ReadOnly в Visual Basic или initonly в Visual C ++ и промежуточном языке.

, поскольку вы не можете пометить это статическое поле как readonly иперекомпиляция, вы застряли с UNSAFE.

Для получения дополнительной информации о работе с SQLCLR в целом (включая инструкции по настройке Visual Studio для обработки подписи сертификата, и даже о том, что это работает в SQL Server 2017, которыйболее ограничен, чем предыдущие версии):

SQLCLR.org

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