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

