如何在Python中使用传递身份验证实现IIS上REST API服务的身份验证?
解决本地IIS NTLM认证的REST API请求问题
方案1:修正requests_ntlm的使用方式
多数401错误源于未正确传递域名或会话构建逻辑错误。务必使用DOMAIN\username格式的用户名,并通过会话对象发送请求,而非单次请求。
示例代码:
import requests from requests_ntlm import HttpNtlmAuth # 构建持久会话 session = requests.Session() # 本地机器认证可使用机器名或 "." 代表本地域,例如 .\Administrator session.auth = HttpNtlmAuth('YOUR_DOMAIN\\your_username', 'your_password') # 发送GET请求 response = session.get('http://localhost/your-api-endpoint') print(response.status_code) print(response.text)
方案2:使用requests-negotiate-sspi库(本地Windows环境推荐)
该库基于Windows SSPI接口实现,对IIS的NTLM认证兼容性更强,既可以自动复用当前登录用户凭据,也支持手动指定账号密码。
首先安装依赖:
pip install requests-negotiate-sspi
方式A:复用当前Windows登录用户凭据(无需输入密码)
import requests from requests_negotiate_sspi import HttpNegotiateAuth session = requests.Session() # 自动绑定当前登录Windows用户的身份 session.auth = HttpNegotiateAuth() response = session.get('http://localhost/your-api-endpoint') print(response.status_code)
方式B:手动指定用户名密码
import requests from requests_negotiate_sspi import HttpNegotiateAuth session = requests.Session() session.auth = HttpNegotiateAuth(username='your_username', password='your_password', domain='YOUR_DOMAIN') response = session.get('http://localhost/your-api-endpoint') print(response.status_code)
关键排查点
- 确认IIS站点身份验证设置:已禁用匿名认证,仅启用NTLM认证(避免仅开启Negotiate模式)。
- 检查API端点URL是否与IIS站点绑定的端口、主机头匹配。
- 验证用户账号拥有该IIS站点及API资源的访问权限(可在IIS管理器中查看站点权限设置)。
内容的提问来源于stack exchange,提问作者namahage
相关产品推荐
相关产品推荐

