多年来,我一直在使用 ASP.NET Core 的防伪系统时遇到问题:
https://github.com/dotnet/aspnetcore/issues/2882
每隔一段时间,用户的防伪表单值与 cookie 值不匹配。这种情况很难重现,微软显然已经放弃帮助我们解决 GitHub 问题。
我想让我的代码有机会覆盖防伪并允许满足某些条件的某些请求。但现在的情况是,一旦防伪系统以 400 状态代码拒绝请求,我的页面代码就永远不会执行。这当然是微软设计的。
我一般不想停止使用防伪功能,也不想从防伪功能中排除某些页面。但我希望我的代码能够“捕获”不良情况,进一步分析它,并决定是否要再次“抛出”它或允许代码正常进行。我认为这可以通过过滤器来完成,但我使用过滤器的尝试失败了。一旦防伪系统拒绝我的请求,我的过滤器就不会被调用。
有人可以帮助我允许防伪部门认为无效的某些请求吗?谢谢你。
您可以通过对整个页面模型禁用 CSRF 保护来选择性地强制执行 CSRF 保护,然后将验证合并到您自己的自定义逻辑中。
[IgnoreAntiforgeryToken]
public class TestModel : PageModel
{
private readonly IAntiforgery antiforgery;
public TestModel(IAntiforgery antiforgery) => this.antiforgery = antiforgery;
public async Task<IActionResult> OnPost(int number)
{
if (number == 5)
return new ContentResult(200, "Fives are fives.");
if (!await antiforgery.IsRequestValidAsync(this.HttpContext))
return new ContentResult(400, "No forgery allowed.");
return new ContentResult(200, $"Your number was {number} and you passed the anti-forgery check.");
}
}
根据您想要执行的检查类型,更全局的方法(例如中间件)可能更适合,但如果您想真正做到细粒度,这是一种可行的方法。