我有以下代码在测试框上完美运行,该测试框以SYSTEM身份运行MSSQLSERVER服务:
currentIdentity = SqlContext.WindowsIdentity;
impersonatedIdentity = currentIdentity.Impersonate();
client.PreAuthenticate = true;
client.Credentials = CredentialCache.DefaultNetworkCredentials;
client.Url = currentURL;
/* Encrypt */
try
{
encryptedText = client.Encrypt(plainText);
}
finally
{
if (impersonatedIdentity != null)
{
impersonatedIdentity.Undo();
}
}
return encryptedText;
此功能的基本思想是通过内部托管的Web服务加密/解密文本。只要在运行MSSQLSERVER服务的服务器上调用此函数作为“SYSTEM”或其他本地帐户,模拟就可以正常工作。如果服务器将MSSQLSERVER服务作为域帐户运行(即DOMAIN \ sqlaccount),则“DOMAIN \ sqlaccount”的凭据将始终传递给Web服务,并且模拟似乎不起作用。
这是预期的行为吗?提前谢谢。
答案 0 :(得分:2)
对于您正在运行SQL Server的服务帐户,该帐户是否已启用模拟?在活动目录中的用户的属性窗口中有一个名为delegation的选项卡。您可以选择不允许委派,允许不加区分地委派,或者配置该帐户被授权委托的服务。默认为“不信任”,这可能是您的问题。看看,看看你找到了什么。
答案 1 :(得分:1)
将加密函数调用移出SQLCLR。从SQL进行Web服务调用是一个非常非常糟糕的主意。 SQL Server资源非常珍贵,不能浪费它们等待HTTP响应,甚至是内部Intranet。我从来没有遇到过合理的解释,为什么要从SQLCLR内部进行Web服务调用,而不是短视的冷静因子。从应用程序调用Web服务,是等待HTTP响应的适当位置。
答案 2 :(得分:0)
您使用什么协议进行身份验证?
如果您使用的是Kerberos,我会期待这种行为。在Kerberos中,自动定义SYSTEM和NETWORK SERVER SPN。但是,如果要使用自定义服务名称,则需要定义SPN(用于该服务名称)以进行身份验证。