Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用System.Net.Http避免可信和权限设置=不安全_C#_.net_Sql Server_Security_Sqlclr - Fatal编程技术网

C# 使用System.Net.Http避免可信和权限设置=不安全

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

尝试从我构建的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\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;