ASP.NET MVC 5中如何携带隐藏csrf-token实现外部网站自动登录
错误原因
419 Page Expired是目标站点(大概率基于Laravel框架开发)的CSRF校验失败报错,核心原因是你提交的_token值和请求携带的会话Cookie不匹配:目标站点的CSRF Token和当前访问者的session是绑定的,每次访问登录页都会生成新的token和对应session标识,直接用硬编码或者缓存的旧token提交都会被拦截。
ASP.NET MVC 5 实现方案
推荐使用服务端预取token + 代理提交/前端自动提交表单的方案,适配不同业务场景:
方案1:服务端代理登录(适合需要在服务端持有目标站登录态的场景)
首先安装HtmlAgilityPack Nuget包用于解析HTML提取token,代码示例:
using System.Net.Http; using HtmlAgilityPack; // 注意HttpClient建议设为静态单例,内部自动维护Cookie容器,保证token和Cookie对应 private static readonly HttpClient _httpClient = new HttpClient(new HttpClientHandler { UseCookies = true, CookieContainer = new System.Net.CookieContainer() }); public ActionResult AutoLogin() { // 第一步:请求目标站登录页,获取最新token和会话Cookie var loginPageResponse = _httpClient.GetAsync("https://test.com/login").Result; loginPageResponse.EnsureSuccessStatusCode(); var htmlContent = loginPageResponse.Content.ReadAsStringAsync().Result; // 解析HTML提取_token值 var doc = new HtmlDocument(); doc.LoadHtml(htmlContent); var token = doc.DocumentNode.SelectSingleNode("//input[@name='_token']").GetAttributeValue("value", ""); // 第二步:构造登录请求参数提交 var loginParams = new Dictionary<string, string> { {"_token", token}, {"username", "你的目标站账号"}, {"password", "你的目标站密码"}, {"terms", "on"} }; var loginContent = new FormUrlEncodedContent(loginParams); var loginResponse = _httpClient.PostAsync("https://test.com/login", loginContent).Result; loginResponse.EnsureSuccessStatusCode(); // 后续可直接用_httpClient调用目标站登录后才能访问的接口 return Content("登录成功"); }
方案2:前端自动提交表单(适合需要在浏览器跳转登录目标站的场景)
如果需要用户在浏览器中直接访问登录后的目标站,可在服务端预取token后渲染表单,自动触发提交:
<!-- 视图层代码 --> <form id="login" target="_blank" method="post" action="https://test.com/login"> <input type="hidden" name="_token" value="@ViewBag.LatestToken"> <input name="username" value="你的目标站账号" /> <input type="password" name="password" value="你的目标站密码" /> <input type="checkbox" name="terms" checked /> </form> <script> window.onload = () => document.getElementById('login').submit(); </script>
注意事项
- 禁止硬编码
_token值,每次提交登录请求前必须重新请求目标站登录页获取最新token - 表单提交时
terms字段的值需和目标站要求一致,勾选状态下默认提交值为on - 若目标站有反爬策略,可在服务端请求时添加
User-Agent、Referer等请求头模拟浏览器行为
内容的提问来源于stack exchange,提问作者Jyoti
相关产品推荐
相关产品推荐

