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

使用Python Requests无法访问启用Basic Auth的IIS网站,PostMan可正常访问

解决IIS上Basic Auth网站的Python Requests访问问题

我之前也碰到过几乎一模一样的情况!结合你描述的现象——自己写的Requests代码、甚至PostMan生成的代码都访问失败,但手动用PostMan能正常请求,访问其他公共站点没问题——大概率是IIS的Basic Auth实现有一些“特殊要求”,和Requests默认的认证逻辑不匹配,下面是几个最可能的原因和对应的解决办法:

1. IIS要求必须先触发401认证挑战再发送认证头

Requests库默认的逻辑是提前把Authorization头加到请求里直接发送,但有些IIS配置下,只有当客户端先收到401(未授权)响应后,再发送带认证头的请求才会被接受。而PostMan手动请求时,会自动处理这个“先挑战再认证”的流程,所以能成功。

解决方法很简单,手动模拟这个流程:

import requests
from requests.auth import HTTPBasicAuth

target_url = "你的IIS网站URL"
username = "你的用户名"
password = "你的密码"
auth = HTTPBasicAuth(username, password)

# 第一步:发送不带认证的请求,触发IIS的401挑战
first_response = requests.get(target_url)
if first_response.status_code == 401:
    # 第二步:带上认证信息重新请求
    final_response = requests.get(target_url, auth=auth)
    print(f"最终响应状态码: {final_response.status_code}")
else:
    print(f"未触发401挑战,状态码: {first_response.status_code}")

2. 手动构造Authorization头,避免Requests的默认编码差异

极少数情况下,IIS对Basic Auth的base64编码格式有严格要求(比如某些特殊字符的处理),这时候可以跳过Requests的auth参数,手动构造认证头试试:

import requests
import base64

username = "你的用户名"
password = "你的密码"
# 构造并编码认证字符串
auth_string = f"{username}:{password}"
encoded_auth = base64.b64encode(auth_string.encode('utf-8')).decode('utf-8')
headers = {
    "Authorization": f"Basic {encoded_auth}"
}

response = requests.get(target_url, headers=headers)
print(response.status_code)

3. 检查Host头是否匹配IIS站点绑定

如果你的IIS站点绑定了特定的主机头(域名),而你的请求里没有正确携带Host头,也可能导致认证失败。PostMan会自动根据URL填充Host头,但有时候Requests在某些环境下可能没处理好,手动加上即可:

headers = {
    "Host": "你的网站域名或IP(和IIS绑定的完全一致)",
    "Authorization": f"Basic {encoded_auth}"
}
response = requests.get(target_url, headers=headers)

至于为什么PostMan生成的代码也失败?因为它生成的代码一般会直接用auth参数,和你自己写的逻辑一样,没有模拟PostMan手动请求时自动处理401挑战的那一步,所以才会出现同样的问题。

先试试第一个方法,这是最常见的解决方案,大概率能解决你的问题!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:17:51