C# 在SQL Server 2014中为不安全程序集创建非对称密钥

C# 在SQL Server 2014中为不安全程序集创建非对称密钥,c#,sql-server,assemblies,sqlclr,encryption-asymmetric,C#,Sql Server,Assemblies,Sqlclr,Encryption Asymmetric,我在Visual Studio VS 2015中签署了2个DLL。一位以前的员工创建了一个非对称密钥和登录名,我在不安全模式下正确运行了其中一个程序集 第二个错误导致以下错误: Msg 10327,第14级,状态1,第27行 为程序集“TableFile”创建程序集失败,因为程序集“TableFile”未获得权限的授权。\u SET=UNSAFE。当以下任一项为true时,将授权程序集:数据库所有者DBO具有不安全的程序集权限,并且数据库在上具有可信任的数据库属性;或者使用证书或非对称密钥对程序

我在Visual Studio VS 2015中签署了2个DLL。一位以前的员工创建了一个非对称密钥和登录名,我在不安全模式下正确运行了其中一个程序集

第二个错误导致以下错误:

Msg 10327,第14级,状态1,第27行 为程序集“TableFile”创建程序集失败,因为程序集“TableFile”未获得权限的授权。\u SET=UNSAFE。当以下任一项为true时,将授权程序集:数据库所有者DBO具有不安全的程序集权限,并且数据库在上具有可信任的数据库属性;或者使用证书或非对称密钥对程序集进行签名,该证书或密钥具有不安全程序集权限的相应登录名

我不能问以前的员工,那么我该如何找到让它运行的方法呢?我也试过:

USE master; 
GO  

CREATE ASYMMETRIC KEY AProjectKey FROM EXECUTABLE FILE = 'E:\sqldlls\TableFile.dll' 
CREATE LOGIN AProjectLogin FROM ASYMMETRIC KEY AProjectKey ;  
GRANT UNSAFE ASSEMBLY TO AProjectLogin ;
GO
这会产生以下错误:

味精15396,16级,状态1,第9行 名为“AProjectKey”的非对称密钥已存在,或者此非对称密钥已添加到数据库中

Msg 15151,16级,状态1,第10行 找不到非对称密钥“AProjectKey”,因为它不存在或您没有权限

Msg 15151,16级,状态1,第11行 找不到登录名“AProjectLogin”,因为它不存在或您没有权限


如何使这两个程序集都在不安全模式下运行?提前感谢。

关于这3条错误消息:

第一种可能是由于非对称密钥已经存在,但名称不同。密钥和证书的公钥必须是唯一的,而不仅仅是名称,尽管这显然也需要是唯一的。每个密钥和证书都有一个公钥散列,称为指纹。创建新密钥/证书时会检查现有密钥/证书的指纹,如果指纹已存在,则会阻止创建,即使是名称不同的密钥/证书。这就是错误消息的含义,或者此非对称密钥已添加到数据库中

或:

这可能意味着主控中存在不同的非对称密钥,即不同的指纹,但名称为ProjectKey

由于无法使用不同的名称创建同一个密钥,因此不存在具有该新名称的非对称密钥,因此无法从该名称创建登录,因为create ASSYMMETRIC key语句再次失败。 由于无法创建登录名,因此无法授予该登录名任何权限。 错误2有助于缩小问题范围。如果错误1是由具有相同名称但不同指纹的现有非对称密钥引起的,则您可以创建登录名(如果该登录名不存在),或者您将收到一个错误,说明登录名(即服务器主体)已存在。但错误是找不到该名称的非对称密钥。这意味着非对称密钥本身已经存在,但名称不同。通过执行以下操作,您可以看到创建了哪些非对称密钥:

从sys.u键中选择*; 但这并不能告诉您哪个程序集来自该程序集,或者使用用于签名此程序集的相同强名称密钥签名的程序集。为此,您需要知道指纹,为此,您需要打开一个命令提示符,最好是Visual Studio在安装时设置的开发人员命令提示符,因为它在打开时设置了正确的路径。然后,运行以下命令:

CD/D E:\sqldll\ sn-T TableFile.dll 你应该看到:

公钥令牌是XXXXXXXXXXXXXX 将XXXXX令牌(即指纹)复制并粘贴到以下查询中:

选择ak.[name],ak.[sid] 来自sys.uk 其中ak.[指纹]=0x{XXXXXXXXXXXXXX};-删除{和} 假设返回一行,我们需要查看登录是否存在。简单地尝试使用非对称密钥创建登录名不会得到登录名(如果它确实存在),因为每个密钥/证书只能创建一个登录名,并且错误消息仅报告您尝试创建的名称为已经存在的名称,即使它可以是同一密钥的不同名称。因此,从返回的行中获取SID并将其粘贴到以下查询中:

选择sp* 从sys.server\u主体sp 其中sp.[sid]=0x{sid_from_sys_不对称_keys};-删除{和} 如果未返回任何行,则应使用该非对称密钥创建登录名

此时应该存在登录名,因此授予它不安全程序集权限


现在再次尝试创建程序集。

完全解决了我的问题@cdub真棒!是缺少登录名,还是登录名就在那里,只是需要权限?登录名就在那里,只是需要权限。@cdub感谢您的澄清。我问的部分原因是登录名可能具有外部访问程序集权限,但不允许 w用于不安全的组件。