【发布时间】:2020-05-02 09:20:51
【问题描述】:
我在 SQL Server 中有一个 CLR 程序集,我需要继承特定帐户的权限。 CLR 函数基本上只是抓取一个网页并以这种方式将其返回给 SQL:
[SqlFunction]
[return: SqlFacet(MaxSize = -1)]
public static SqlChars Get(SqlChars H, SqlChars url)
{
var client = new WebClient();
client.Credentials = CredentialCache.DefaultNetworkCredentials;
AddHeader(H, client);
return new SqlChars(
client.DownloadString(
Uri.EscapeUriString(url.ToSqlString().Value)
).ToCharArray());
}
我希望它能够使用特定帐户详细信息通过 NTLM 进行身份验证。这在 SQL 之外的 C# 程序中运行良好,但作为 CLR 函数,它只返回 401 Unauthorized 消息,这是因为 DefaultNetworkCredentials 是 SQL Server 服务帐户的消息(我通过将服务设置为使用我的凭据来确认这一点,并且然后 CLR 完美运行)
我的理解是,这样做的方法是在 SQL Server 中使用该帐户的详细信息创建一个 Credential,因为这就是 documentation 所说的:
凭据提供了一种允许 SQL Server 身份验证用户在 SQL Server 之外拥有身份的方法。这主要用于在具有 EXTERNAL_ACCESS 权限集的程序集中执行代码。
我可以这样做,但我似乎无法找到任何方法将该凭据映射到程序集。我该怎么做?
【问题讨论】:
-
我不确定该特定声明中的文档是否正确。这似乎没有出现在任何其他与凭据相关的页面上。无论哪种方式,凭据都映射到 SQL Server 登录,而不是程序集。而且,当您说“继承特定帐户的权限”时,您是指用于外部操作(如文件系统、网络、注册表等)的 Windows 帐户吗?您能否更新问题以准确说明您正在尝试执行的操作需要其他帐户的权限吗?谢谢。
-
@SolomonRutzky 更新解释 - 我希望它使用特定帐户详细信息进行一些 NTLM 身份验证。默认情况下,它会获取 SQL Server 服务帐户的详细信息
-
嗨,丹。我已经用我的测试结果更新了我的答案。该文档似乎是错误的,实际上不能以这种方式使用凭据。但是,我确实注意到了两种选择。
标签: .net sql-server credentials impersonation sqlclr