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

如何确保ASP.NET Core控制器方法仅按特定顺序被访问?

防止直接访问支付页面的最优方案

你的场景是:Tech控制器有Cart和Payment两个异步Action,Cart页面通过POST表单提交到Payment,现在要禁止用户直接通过URL(MyDomain/Tech/Payment)访问Payment页面,必须通过购物车的按钮进入。用TempData记录页面访问的方案不够可靠,推荐以下更优的实现方式:

方案1:限制请求方法+防伪令牌验证

这是ASP.NET Core原生的安全方案,既能阻断直接GET访问,又能确保请求来自本站合法表单:

修改控制器代码

给Payment Action添加[HttpPost]和[ValidateAntiForgeryToken]特性:

public async Task<IActionResult> Cart()
{
    //some logic
}

// 仅允许POST请求,且验证防伪令牌
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Payment()
{
    //some logic
}

视图无需额外修改

你现有的Cart.cshtml代码中,asp-action和asp-controller标签助手会自动在表单中生成防伪令牌(一个隐藏的__RequestVerificationToken输入框),确保提交的请求能通过验证。

效果说明

  • 用户直接在地址栏输入MyDomain/Tech/Payment发起GET请求时,会返回405 Method Not Allowed(方法不允许),无法访问页面
  • 即使有人手动构造POST请求,如果没有正确的防伪令牌,会返回400 Bad Request,只有通过购物车页面的表单提交才能正常进入Payment

方案2:处理GET请求并重定向(可选)

如果需要给直接访问的用户更友好的反馈,可以添加一个GET版本的Payment Action,直接重定向到购物车页面:

public async Task<IActionResult> Cart()
{
    //some logic
}

// 处理GET请求,直接重定向到购物车
public async Task<IActionResult> Payment()
{
    return RedirectToAction(nameof(Cart));
}

// 仅处理合法的POST表单请求
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Payment(/* 可添加表单参数 */)
{
    //some logic
}

为什么比TempData方案更优

  • 防伪令牌是ASP.NET Core内置的安全机制,专门用于防止跨站请求伪造,同时天然确保请求来自合法的表单提交,无需额外维护会话状态
  • TempData依赖会话,存在超时或被篡改的风险,逻辑也更复杂
  • 请求方法限制直接从HTTP层面阻断了非法访问,逻辑清晰且安全性更高

内容的提问来源于stack exchange,提问作者Alice

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:22:39