使用 System.Net.Http 避免 TRUSTWORTHY ON 和 PERMISSION_SET = UNSAFE

Avoiding TRUSTWORTHY ON and PERMISSION_SET = UNSAFE using System.Net.Http

尝试使用 CLR 集成从我构建的用于 SQL 的 DLL 创建存储过程。我想我需要 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'。但是,当我尝试为依赖于 System.Net.Http 的 CLRTest01 执行此操作时,我 运行 遇到了我的 System.Net.Http 未签名或格式错误的问题。

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

Error when using v4.0_2.0.0.0__b03f5f7f11d50a3a - Assembly 'System.Net.Http' could not be installed because existing policy would keep it from being used.

Error when using v4.0_4.0.0.0__b03f5f7f11d50a3a - CREATE ASSEMBLY failed because type 'System.Net.Http.HttpContent' in safe assembly 'System.Net.Http' has a static field 'EncodingsWithBom'. Attributes of static fields in safe assemblies must be marked readonly in Visual C#, ReadOnly in Visual Basic, or initonly in Visual C++ and intermediate language.

这让我相信我需要 System.Net.Http.

的签名版本

所有 .NET Framework 库都已签名。问题是您需要从强名称密钥 (SNK) 或证书 (CER) 的 Public 密钥创建 [master] 中的非对称密钥或证书,该密钥用于签署该程序集(和通常一个程序集都被强命名为 并用证书签名)。

您可以执行以下操作以避免 TRUSTWORTHY (which is absolutely the right thing to do):

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 = SAFESystem.Net.Http 一起使用:

type 'System.Net.Http.HttpContent' in safe assembly 'System.Net.Http' has a static field 'EncodingsWithBom'. Attributes of static fields in safe assemblies must be marked readonly in Visual C#, ReadOnly in Visual Basic, or initonly in Visual C++ and intermediate language.

由于您无法将该静态字段标记为 readonly 并重新编译,因此您只能使用 UNSAFE

有关一般使用 SQLCLR 的更多信息(包括有关设置 Visual Studio 以处理证书签名,甚至在 SQL Server 2017 中工作的说明,这比以前的版本更严格):

SQLCLR.org