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

时间:2018-05-25 21:07:27

标签: c# .net sql-server security sqlclr

尝试从我使用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 
  

使用v4.0_2.0.0.0__b03f5f7f11d50a3a时出错     - Assembly&System; Net.Http'无法安装,因为现有政策会阻止其被使用。

     

使用v4.0_4.0.0.0__b03f5f7f11d50a3a时出错     - CREATE ASSEMBLY失败,因为键入' System.Net.Http.HttpContent'在安全装配' System.Net.Http'有一个静态字段' EncodingsWithBom'。安全程序集中静态字段的属性必须在Visual C#,Visual Basic中的ReadOnly或Visual C ++和中间语言中的initonly中标记为只读。

这让我相信我需要一个签名版本的 System.Net.Http

1 个答案:

答案 0 :(得分:3)

所有.NET Framework库都已签名。问题是您需要在[master]中使用用于签署该程序集的强名称密钥(SNK)或证书(CER)的公钥创建非对称密钥或证书(通常是程序集具有被强烈命名的用证书签名。)

您可以执行以下操作以避免TRUSTWORTHYwhich 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 一起使用:

  

在安全程序集“System.Net.Http”中输入'System.Net.Http.HttpContent'有一个静态字段'EncodingsWithBom'。安全程序集中静态字段的属性必须在Visual C#,Visual Basic中的ReadOnly或Visual C ++和中间语言中的initonly中标记为只读。

因为您无法将该静态字段标记为readonly并重新编译,所以您会被UNSAFE困住。

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

SQLCLR.org