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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:24:00