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

如何使用Python3凭账号密码实现ADFS认证访问受保护站点?

用Python3实现ADFS账号密码认证访问受保护站点

我之前刚好折腾过类似的ADFS认证场景,用Python完全能模拟浏览器的操作逻辑——核心就是跟着重定向走,解析并提交登录表单,同时维护好会话Cookie。下面是具体的实现步骤和代码:

所需依赖

首先需要安装两个常用库:requests用来处理HTTP请求和会话,beautifulsoup4用来解析HTML表单。执行以下命令安装:

pip install requests beautifulsoup4

实现步骤与代码

import requests
from bs4 import BeautifulSoup

# 配置参数
TARGET_URL = "https://www.example.com"  # 你的目标站点
USERNAME = "your_account@example.com"   # 你的登录账号
PASSWORD = "your_password"              # 你的登录密码

# 1. 初始化会话,自动维护Cookie(和浏览器的会话逻辑一致)
session = requests.Session()
# 可选:设置浏览器UA,避免被站点识别为爬虫
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
})

try:
    # 2. 访问目标站点,触发ADFS重定向流程
    initial_response = session.get(TARGET_URL, allow_redirects=True)
    initial_response.raise_for_status()  # 检查请求是否成功

    # 3. 解析ADFS登录页面的表单字段
    soup = BeautifulSoup(initial_response.content, "html.parser")
    login_form = soup.find("form")
    if not login_form:
        raise ValueError("未找到登录表单,可能重定向流程异常")
    
    # 获取表单提交的目标URL
    form_action = login_form.get("action")
    # 提取表单中所有字段(包括隐藏的__VIEWSTATE、__EVENTVALIDATION等必填字段)
    form_data = {}
    for input_tag in login_form.find_all("input"):
        input_name = input_tag.get("name")
        input_value = input_tag.get("value", "")
        if input_name:  # 忽略没有name属性的输入框
            form_data[input_name] = input_value

    # 4. 填充账号密码(注意:字段名可能因ADFS配置不同而变化!)
    # 常见字段名:UserName/Password、txtUsername/txtPassword、ctl00$Content$txtUser等
    # 建议用浏览器开发者工具查看登录表单的input name,替换成实际字段名
    form_data["UserName"] = USERNAME
    form_data["Password"] = PASSWORD
    # 有些表单需要提交按钮的字段,比如SignIn按钮的name
    form_data["SignIn"] = "Sign In"

    # 5. 提交登录表单,完成认证
    login_response = session.post(form_action, data=form_data, allow_redirects=True)
    login_response.raise_for_status()

    # 6. 验证认证结果,访问受保护资源
    protected_response = session.get(TARGET_URL)
    protected_response.raise_for_status()

    print("✅ 认证成功!")
    # 这里可以处理目标站点的内容,比如打印页面片段
    print("页面内容预览:\n", protected_response.text[:500])

except requests.exceptions.RequestException as e:
    print(f"❌ 请求出错:{e}")
except ValueError as e:
    print(f"❌ 解析异常:{e}")

关键注意事项

  • 表单字段名适配:不同ADFS服务器的表单字段名可能不一样(比如ASP.NET生成的带前缀的字段名)。你需要打开Chrome开发者工具,在登录页面查看表单的input标签name属性,替换代码中对应的字段名。
  • 多因素认证(MFA):如果目标站点启用了MFA(比如短信、微软Authenticator),上面的方法就失效了。这种情况可以考虑用selenium模拟真实浏览器操作,手动完成MFA或者集成MFA验证逻辑。
  • Cookie与重定向:一定要用requests.Session()来维护会话,它会自动保存和发送Cookie,这是认证成功的关键。同时开启allow_redirects=True,让requests自动处理ADFS的多次重定向。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:11:18