如何让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语句,可帮助定位组件未注册、权限不足等具体问题。
注意事项
- 若使用自动凭据模式,需确保SQL Server服务账户拥有访问目标API的权限。
- 若API服务器使用自签名证书,需保留
Option 13056设置以忽略SSL错误。 - 确认
WinHttp.WinHttpRequest.5.1组件在SQL服务器上已正确注册,可通过regsvr32.exe winhttp.dll重新注册。
内容的提问来源于stack exchange,提问作者Waza_Be
相关产品推荐
相关产品推荐

