php-curl使用NTLM凭证认证同机IIS部署的.NET Core API失败如何解决
客户端抓包方法与故障排查方向
客户端侧抓取php-curl原始请求方法
- 开启curl内置调试日志:修改curl配置,开启
CURLOPT_VERBOSE参数即可输出完整的请求、响应交互日志,可通过CURLOPT_STDERR指定日志保存路径,参考代码如下:
$ch = curl_init($apiUrl); // 开启verbose调试模式 curl_setopt($ch, CURLOPT_VERBOSE, true); // 指定日志输出文件 $logFile = fopen('./curl_request_debug.log', 'w+'); curl_setopt($ch, CURLOPT_STDERR, $logFile); // 保留原有其他curl配置不变 $res = curl_exec($ch); fclose($logFile); curl_close($ch);
日志文件中会包含完整的请求头、请求体、SSL交互信息、响应头、响应体等所有原始数据。
- 本地代理抓包:在服务器上安装Fiddler、Charles等本地抓包代理工具,给curl添加代理配置
curl_setopt($ch, CURLOPT_PROXY, '127.0.0.1:8888')(端口和代理工具监听端口保持一致),即可在代理工具中可视化查看curl发起的完整请求报文。
故障排查解决方向
- 校验curl NTLM认证配置:NTLM为多轮握手认证,需要显式开启curl的NTLM支持,必须配置两个核心参数:
CURLOPT_HTTPAUTH设为CURLAUTH_NTLM,指定使用NTLM认证方式CURLOPT_USERPWD格式必须为域名\用户名:密码,本地账户的域名填写服务器机器名即可
可通过curl_version()查看当前PHP绑定的libcurl是否支持NTLM认证,部分精简版curl库会砍掉NTLM支持。
- 对齐请求头配置:对比FRT日志中Postman成功请求和curl失败请求的头信息,重点修正以下差异点:
- 必须携带
Connection: Keep-Alive头,NTLM认证需要复用同一个TCP连接完成3次握手,若curl配置了CURLOPT_FORBID_REUSE会直接导致认证失败 - 确认
Authorization头格式为NTLM <base64认证串>,不要写错前缀 - 校验Host头值和.NET Core API站点绑定的主机名完全一致,IIS的NTLM认证会校验Host头匹配性
- 必须携带
- 排查同服务器回环认证限制:Windows默认开启NTLM回环检查,同服务器内部发起的NTLM请求很容易被拦截,可尝试两种验证方案:
- 进入IIS的API站点配置,关闭
身份验证 -> Windows身份验证 -> 高级设置 -> 启用内核模式认证 - 测试环境可临时修改注册表禁用回环检查,验证是否是该问题导致
- 进入IIS的API站点配置,关闭
- 权限校验:确认传入的NTLM账号对.NET Core API站点有访问权限,同时检查PHP应用池的运行身份是否存在访问限制,可先用本地管理员账号配置到
CURLOPT_USERPWD做排除测试。
内容的提问来源于stack exchange,提问作者christok
相关产品推荐
相关产品推荐

