使用Python-requests对ASP架构aspx网站做身份验证失败问题咨询
登录失败原因排查
整理出以下几个核心错误点:
- Payload编码错误:你手动拼接urlencoded格式的POST请求体,
__VIEWSTATE、__EVENTVALIDATION两个参数本身包含/、+、=等URL特殊字符,直接格式化拼接会导致编码错误,服务端无法正确解析参数直接判定请求非法。requests库的data参数传入字典时会自动完成URL编码,无需手动拼接字符串。 - 请求头一致性校验失败:登录POST请求的User-Agent为Chrome 91版本,后续跳转GET请求的User-Agent修改为了Chrome 92版本,ASP.NET服务端通常会校验同一会话的请求头特征,UA不一致会被判定为异常会话直接清除登录状态。
- Cookie手动覆盖问题:requests的Session实例会自动管理同一会话下的所有Cookie,你在第二次GET请求时手动指定了仅包含
ASP.NET_SessionId的Cookie头,覆盖了Session中登录成功后服务端返回的表单认证Cookie(一般为.ASPXAUTH),导致请求无有效身份凭证被重定向回登录页。 - 路径大小写问题:观察登录成功的跳转路径为小写的
/tms/前缀,你跳转的目标地址如果使用大写/TMS/前缀,部分部署在Linux环境的ASP.NET服务会因路由大小写敏感判定路径非法,跳转回登录页。
修正后的代码示例
import requests from bs4 import BeautifulSoup # 配置参数 login_url = "https://portal-vesta.sequoialog.com.br/tms/LoginPortal.aspx" home_url = "https://portal-vesta.sequoialog.com.br/tms/HomePortal.aspx?Usu=1070rpr" user = "你的账号" password = "你的密码" # 统一UA,全程保持一致 UA = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36" def get_ev_vs(page): soup = BeautifulSoup(page.text, 'html.parser') vs = soup.select_one('#__VIEWSTATE')['value'] ev = soup.select_one('#__EVENTVALIDATION')['value'] return ev, vs with requests.Session() as s: s.headers.update({"User-Agent": UA}) # 获取初始化参数 init_page = s.get(login_url) ev, vs = get_ev_vs(init_page) # 构造POST payload用字典,自动编码 post_payload = { "Ajax": "UpdatePanel1|Button1", "Button1": "ENTRAR", "__ASYNCPOST": "true", "__EVENTARGUMENT": "", "__EVENTTARGET": "", "__EVENTVALIDATION": ev, "__LASTFOCUS": "", "__VIEWSTATE": vs, "txtSenha": password, "txtUsuario": user, "txtUsuarioSolicita": "" } post_headers = { 'Cache-Control': 'no-cache', 'X-MicrosoftAjax': 'Delta=true', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Accept': '*/*' } # 提交登录 login_resp = s.post(login_url, data=post_payload, headers=post_headers) # 校验登录结果 if "HomePortal.aspx" in login_resp.text: print("登录成功") # 直接用Session访问目标页,无需手动加Cookie和UA home_resp = s.get(home_url) print(home_resp.text) else: print("登录失败,返回内容:", login_resp.text)
内容的提问来源于stack exchange,提问作者Rafael Ribeiro
相关产品推荐
相关产品推荐

