You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让SQL Server连接采用NTLM认证的REST API?

SQL Server调用NTLM认证REST API返回401未授权的解决方法

你当前的SQL代码未配置NTLM认证相关参数,导致请求被API服务器拒绝。Postman能正常调用是因为它自动处理了NTLM身份验证流程,而WinHttp.WinHttpRequest.5.1需要显式配置认证策略或凭据。

修改后的完整代码

Declare @Object as Int;
DECLARE @hr int
Declare @json as table(RESPONSE nvarchar(max))

-- 创建WinHttpRequest对象
Exec @hr=sp_OACreate 'WinHttp.WinHttpRequest.5.1', @Object OUT;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 启用忽略证书错误(按需取消注释)
-- EXEC @hr = sp_OASetProperty @object, 'Option', 13056, 4; -- WinHttpRequestOption_SslErrorFlag_Ignore_All
-- IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 关键:设置自动登录策略,使用SQL Server服务账户的NTLM凭据
EXEC @hr=sp_OASetProperty @Object, 'SetAutoLogonPolicy', 0;
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 打开请求
Exec @hr=sp_OAMethod @Object, 'open', NULL, 'get',
      'https://blahblahblah/GetInventoryDetails?barcode=00387127399232474375', 
      'false'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 若需指定特定用户凭据(替代自动凭据模式),取消注释以下行
-- EXEC @hr=sp_OAMethod @Object, 'SetCredentials', NULL, '你的用户名', '你的密码', 0; -- 0代表NTLM认证类型
-- IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 发送请求
Exec @hr=sp_OAMethod @Object, 'send'
IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object

-- 获取响应文本
INSERT into @json (RESPONSE) exec sp_OAGetProperty @Object, 'responseText'
select * from @json

-- 销毁对象
EXEC sp_OADestroy @Object

关键说明

  • 自动凭据模式:SetAutoLogonPolicy 0 会让WinHttpRequest自动使用SQL Server服务账户的NTLM凭据认证,要求该服务账户已被API服务器授权访问。
  • 指定凭据模式:如果需要用特定用户身份访问API,使用SetCredentials方法,第三个参数0明确指定NTLM认证类型。
  • 错误检查:保留所有IF @hr <> 0 EXEC sp_OAGetErrorInfo @Object语句,可帮助定位组件未注册、权限不足等具体问题。

注意事项

  1. 若使用自动凭据模式,需确保SQL Server服务账户拥有访问目标API的权限。
  2. 若API服务器使用自签名证书,需保留Option 13056设置以忽略SSL错误。
  3. 确认WinHttp.WinHttpRequest.5.1组件在SQL服务器上已正确注册,可通过regsvr32.exe winhttp.dll重新注册。

内容的提问来源于stack exchange,提问作者Waza_Be

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:14:56