解决 ASP.NET Core 防伪失败问题

问题描述 投票:0回答:1

背景

多年来,我一直在使用 ASP.NET Core 的防伪系统时遇到问题:

https://github.com/dotnet/aspnetcore/issues/2882

每隔一段时间,用户的防伪表单值与 cookie 值不匹配。这种情况很难重现,微软显然已经放弃帮助我们解决 GitHub 问题。

目标

我想让我的代码有机会覆盖防伪并允许满足某些条件的某些请求。但现在的情况是,一旦防伪系统以 400 状态代码拒绝请求,我的页面代码就永远不会执行。这当然是微软设计的。

我一般不想停止使用防伪功能,也不想从防伪功能中排除某些页面。但我希望我的代码能够“捕获”不良情况,进一步分析它,并决定是否要再次“抛出”它或允许代码正常进行。我认为这可以通过过滤器来完成,但我使用过滤器的尝试失败了。一旦防伪系统拒绝我的请求,我的过滤器就不会被调用。

有人可以帮助我允许防伪部门认为无效的某些请求吗?谢谢你。

c# asp.net-core razor-pages
1个回答
0
投票

您可以通过对整个页面模型禁用 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.");
    }
}

根据您想要执行的检查类型,更全局的方法(例如中间件)可能更适合,但如果您想真正做到细粒度,这是一种可行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.