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

使用Ruby Net/HTTP无法通过Basic Auth认证多认证模式的IIS服务器

解决Ruby Net/HTTP无法通过Basic Auth认证IIS服务器的问题

这种情况我之前也碰到过——当IIS同时开启Negotiate、NTLM和Basic Auth时,Ruby的Net/HTTP默认的认证流程容易“跑偏”,要么优先尝试Negotiate/NTLM(但你的代码只配置了Basic),要么处理Basic Auth的方式和IIS的预期不匹配。下面给你两个可行的解决方案:

方案1:手动构造Basic Auth请求头,强制使用Basic认证

Net/HTTP的basic_auth方法会先发送无认证的请求,等服务器返回401后再带上Basic凭证,但如果服务器返回的WWW-Authenticate头里有多种方案,Net/HTTP可能会优先尝试Negotiate/NTLM,导致Basic认证没机会生效。这时候我们可以跳过自动流程,直接在请求里带上Authorization头:

require 'net/http'
require 'base64'

# 替换成你的IIS服务器地址
uri = URI('http://your-iis-server-target-url')
http = Net::HTTP.new(uri.host, uri.port)

request = Net::HTTP::Get.new(uri)
# 手动编码用户名和密码,构造Basic Auth头
credentials = Base64.strict_encode64('your_username:your_password')
request['Authorization'] = "Basic #{credentials}"

response = http.request(request)
# 验证响应结果
puts response.code
puts response.body

方案2:使用支持NTLM认证的第三方库

既然浏览器用NTLM可以成功认证,说明服务器对NTLM的兼容性更好。Ruby的Net/HTTP原生对NTLM支持有限,你可以用httpclient这个gem,它对NTLM认证的处理更完善:

首先安装gem:

gem install httpclient

然后编写代码:

require 'httpclient'

client = HTTPClient.new
# 指定目标URL、用户名、密码,明确使用NTLM认证
client.set_auth('http://your-iis-server-target-url', 'your_username', 'your_password', :ntlm)
response = client.get('http://your-iis-server-target-url')

puts response.code
puts response.body

为什么会出现这个问题?

IIS返回的WWW-Authenticate头包含三种认证方案时,Net/HTTP的自动认证机制会按顺序尝试Negotiate、NTLM,最后才是Basic。而如果你的代码只配置了Basic Auth,这个流程就会卡住——因为Net/HTTP可能在尝试Negotiate/NTLM时失败,却没有 fallback到Basic。手动构造头或者换用支持NTLM的库,就能绕开这个自动选择的坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:36