Eviter TRUSTWORTHY ON et PERMISSION_SET = UNSAFE à l’aide de System.Net.Http

Essayer de créer une procédure stockée à partir d’une DLL que j’ai construite pour pouvoir utiliser SQL avec l’intégration CLR. Je pense que j’ai besoin d’une version signée de System.Net.Http et explique pourquoi ci-dessous. Tout conseil ou astuce serait apprécié.

La solution fonctionne à 100% si j’utilise la commande

ALTER DATABASE test2 SET TRUSTWORTHY ON 

Puis je crée l’assemblage à l’aide des commandes suivantes

 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 

Si je choisis de faire confiance aux parameters par défaut, j’aimerais pouvoir le faire sans utiliser le niveau d’autorisation «UNSAFE», mais plutôt «SAFE». Cependant, lorsque j’essaie de le faire pour CLRTest01, qui dépend de System.Net.Http, il semble que le problème de mon System.Net.Http soit un format non signé ou incorrect.

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

Erreur lors de l’utilisation de la v4.0_2.0.0.0__b03f5f7f11d50a3a – L’assemblage ‘System.Net.Http’ n’a pas pu être installé car la stratégie existante l’empêchait d’être utilisée.

Erreur lors de l’utilisation de la v4.0_4.0.0.0__b03f5f7f11d50a3a – CREATE ASSEMBLY a échoué car le type ‘System.Net.Http.HttpContent’ dans l’assembly sécurisé ‘System.Net.Http’ contient un champ statique ‘EncodingsWithBom’. Les atsortingbuts de champs statiques dans des assemblys sécurisés doivent être marqués en lecture seule dans Visual C #, ReadOnly en Visual Basic ou initonly en Visual C ++ et en langage intermédiaire.

Ce qui me porte à croire que j’ai besoin d’une version signée de System.Net.Http .

Toutes les bibliothèques .NET Framework sont déjà signées. Le problème est que vous devez créer une clé asymésortingque ou un certificate dans [master] partir de la clé publique de la clé de nom fort (SNK) ou du certificate (CER) utilisé pour signer cette assemblée (et souvent une assemblée a été à la fois fortement nommé et signé avec un certificate).

Vous pouvez faire ce qui suit pour éviter TRUSTWORTHY ( ce qui est absolument la bonne chose à faire ):

 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]; 

Ensuite, vous pouvez faire ceci:

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

Au-delà de cela, vous ne pourrez pas utiliser PERMISSION_SET = SAFE avec System.Net.Http en raison du message d’erreur que vous avez publié:

type ‘System.Net.Http.HttpContent’ dans l’assemblage sécurisé ‘System.Net.Http’ a un champ statique ‘EncodingsWithBom’. Les atsortingbuts de champs statiques dans des assemblys sécurisés doivent être marqués en lecture seule dans Visual C #, ReadOnly en Visual Basic ou initonly en Visual C ++ et en langage intermédiaire.

comme vous ne pouvez pas marquer ce champ statique comme en readonly et recomstackr, vous êtes bloqué avec UNSAFE .

Pour plus d’informations sur l’utilisation de SQLCLR en général (y compris des instructions sur la configuration de Visual Studio pour gérer la signature du certificate, voire sur SQL Server 2017, qui est plus ressortingctif que les versions précédentes):

SQLCLR.org