如何提取实时生成的data-bind表单数据?Azure AD认证i19参数问题
解决Azure AD认证中i19参数的生成问题
我来帮你拆解这个i19参数的生成逻辑——这类Azure AD登录页面的timeOnPage绑定值,核心逻辑其实很直观,下面是具体的分析和Python实现方案:
1. 确认i19的生成逻辑
从页面里的data-bind="value: timeOnPage"可以看出,这个参数用的是Knockout.js的绑定语法,它的本质是用户从页面加载到提交表单时的停留毫秒数:
- 页面初始化时,浏览器会记录当前的时间戳(用
Date.now(),也就是UTC时间的毫秒数) - 提交表单瞬间,用当前时间戳减去页面加载时的初始时间戳,得到的差值就是
timeOnPage的值,也就是最终的i19参数 - 最后这个值会被URL编码后随表单一起发送
2. 在Python中模拟生成i19值
因为Python没法直接执行页面的JavaScript,我们可以手动模拟这个计时逻辑,步骤如下:
步骤1:记录页面加载时间
当你第一次请求Azure AD的登录页面时,记下请求完成的本地时间(用毫秒级时间戳,和浏览器的Date.now()对齐):
import time import requests # 初始化会话,请求登录页面 session = requests.Session() login_page_url = "https://login.microsoftonline.com/你的租户ID/oauth2/v2.0/authorize..." response = session.get(login_page_url) # 记录页面加载完成的毫秒级时间戳 page_load_ms = time.time() * 1000
步骤2:计算停留时间(i19值)
在准备发送POST认证请求前,计算当前时间和页面加载时间的差值,这个差值就是我们要的i19:
# 可选:模拟用户在页面上的操作停留时间(比如2秒) time.sleep(2) # 计算当前时间与页面加载时间的毫秒差 current_time_ms = time.time() * 1000 i19_value = int(current_time_ms - page_load_ms)
步骤3:构造并发送POST请求
把i19值加入表单参数,和其他认证参数一起发送:
# 构造认证表单参数 auth_payload = { "i19": str(i19_value), "username": "你的用户名", "password": "你的密码", # 其他必填参数:client_id、redirect_uri等 } # 发送POST认证请求 auth_response = session.post(login_page_url, data=auth_payload)
3. 验证你的示例
你提到印度标准时间13:53:58时i19值为55964,这个数值正好是55964毫秒(约56秒),完全符合「页面加载后停留56秒提交」的逻辑,和我们的推导一致。
注意事项
- 如果页面存在重定向,要确保记录的是最终加载的认证页面的时间
- 尽量让模拟的停留时间接近真实用户的操作时长,避免触发Azure AD的反拦截机制
- 若遇到参数不匹配的情况,可以用浏览器开发者工具的Network标签,对比实际发送的
i19值和你计算的差值,微调时间计算逻辑
内容的提问来源于stack exchange,提问作者Navdeep Singh
相关产品推荐
相关产品推荐

