使用 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 = SAFE
与 System.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 中工作的说明,这比以前的版本更严格):
尝试使用 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 = SAFE
与 System.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 中工作的说明,这比以前的版本更严格):