使用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
相关产品推荐
相关产品推荐

