C# 使用System.Net.Http避免可信和权限设置=不安全
尝试从我构建的DLL中创建一个存储过程,该DLL使用CLR集成与SQL一起使用。我想我需要一个签名版的System.Net.Http,并在下面解释原因。如有任何建议或提示,将不胜感激 如果我使用该命令,解决方案100%有效C# 使用System.Net.Http避免可信和权限设置=不安全,c#,.net,sql-server,security,sqlclr,C#,.net,Sql Server,Security,Sqlclr,尝试从我构建的DLL中创建一个存储过程,该DLL使用CLR集成与SQL一起使用。我想我需要一个签名版的System.Net.Http,并在下面解释原因。如有任何建议或提示,将不胜感激 如果我使用该命令,解决方案100%有效 ALTER DATABASE test2 SET TRUSTWORTHY ON 然后使用以下命令创建部件 CREATE ASSEMBLY [System.Net.Http] AUTHORIZATION dbo FROM 'C:\Windows\Microsoft.NET\a
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
当我选择信任默认设置时,我希望能够在不使用权限级别“不安全”的情况下执行此操作,而使用“安全”。但是,当我尝试为依赖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时出错
-无法安装程序集“System.Net.Http”,因为现有策略将阻止使用该程序集
使用v4.0_4.0.0.0_b03f5f7f11d50a3a时出错
-创建程序集失败,因为安全程序集“System.Net.Http”中的类型“System.Net.Http.HttpContent”具有静态字段“EncodingsWithBom”。安全组件中静态字段的属性必须在VisualC中只读标记,在Visual Basic中只读,或者仅在Visual C++和中间语言中使用。
这让我相信我需要一个签名版的System.Net.Http所有的.Net Framework库都已经签名了。问题在于,您需要在
[master]
中使用强名称密钥(SNK)或证书(CER)的公钥创建一个非对称密钥或证书,该公钥用于对程序集进行签名(通常程序集具有强名称并使用证书进行签名)
您可以执行以下操作以避免值得信赖的():
然后你可以这样做:
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\u SET=SAFE
与System.Net.Http一起使用:
安全程序集“System.Net.Http”中的类型“System.Net.Http.HttpContent”有一个静态字段“EncodingsWithBom”。安全组件中静态字段的属性必须在VisualC中只读标记,在Visual Basic中只读,或者仅在Visual C++和中间语言中使用。
由于无法将该静态字段标记为只读
并重新编译,因此只能使用不安全
有关一般使用SQLCLR的更多信息(包括有关设置Visual Studio以处理证书签名的说明,甚至在SQL Server 2017中进行此工作的说明,SQL Server 2017比以前的版本更具限制性):
您使用的是什么版本的SQL Server?是否可以改用HttpWebRequest
?这至少已经是SQL Server CLR主机的一部分。另外,您可能应该从程序集的原始位置添加程序集,而不是直接从GAC添加程序集。现在,要使我的自定义DLL依靠它工作。@LINQtothepast自定义DLL需要用证书签名,请将该证书的公钥(.cer文件)加载到主数据库中,从该证书创建一个登录名,并授予该登录名不安全程序集
权限。请访问以获取如何实现这一点的链接,包括在VisualStudio中实现自动化(说明可以在我的博客上找到,链接到该站点,或者在这里:或第3部分)。
USE [SomeDatabase];
CREATE ASSEMBLY [System.Net.Http]
FROM 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Net.Http.dll'
WITH PERMISSION_SET = UNSAFE;