如何在 ASP.NET Core 3.1 中实现自定义 ValidateAntiforgeryTokenAuthorizationFilter

2023-11-27

我想实现一个过滤器,当身份验证令牌身份验证时,该过滤器会跳过防伪令牌的验证(Bearer) 用来。

在 ASP.NET Core 2.2 中ValidateAntiforgeryTokenAuthorizationFilter and AutoValidateAntiforgeryTokenAuthorizationFilter是公开的(即使住在Microsoft.AspNetCore.Mvc.ViewFeatures.Internal命名空间),所以我能够继承后者并覆盖ShouldValidate方法很容易。

在 ASP.NET Core 3.0 中,它们成为内部的,因此不可能仅继承它们。我可以复制粘贴代码,但这显然不是理想的解决方案。

我正在关注防止 ASP.NET Core 中的跨站点请求伪造 (XSRF/CSRF) 攻击来自 MSDN 的文章,但它并没有真正提到与我的场景相关的任何内容。


通常你可以使用[IgnoreAntiforgeryToken]属性,如果您可以在编译时确定应忽略 csrf 令牌。如果您希望在运行时具有这样的能力,您可以创建一个自定义的FilterProvider那将提供一个IAntiforgeryPolicy如果有一个Authroization: Bearer json-web-token标头。

例如,我们可以创建一个自定义的AutoSkipAntiforgeryFilterProvider如下:

public class AutoSkipAntiforgeryFilterProvider: IFilterProvider
{
    private const string BEARER_STRING = "Bearer";
    public int Order => 999;
    public void OnProvidersExecuted(FilterProviderContext context) { }
    public void OnProvidersExecuting(FilterProviderContext context)
    {
        if (context == null) { throw new ArgumentNullException(nameof(context)); }
        if (context.ActionContext.ActionDescriptor.FilterDescriptors != null)
        {
            var headers = context.ActionContext.HttpContext.Request.Headers;
            if (headers.ContainsKey("Authorization"))
            {
                var header = headers["Authorization"].FirstOrDefault();
                if(header.StartsWith(BEARER_STRING,StringComparison.OrdinalIgnoreCase))
                {
                    var FilterDescriptor = new FilterDescriptor(SkipAntiforgeryPolicy.Instance, FilterScope.Last);
                    var filterItem = new FilterItem( FilterDescriptor,SkipAntiforgeryPolicy.Instance);
                    context.Results.Add(filterItem);
                }
            }
        }
    }

    // a dummy IAntiforgeryPolicy
    class SkipAntiforgeryPolicy : IAntiforgeryPolicy, IAsyncAuthorizationFilter
    {
        // a singleton 
        public static SkipAntiforgeryPolicy Instance = new SkipAntiforgeryPolicy();
        public Task OnAuthorizationAsync(AuthorizationFilterContext context) => Task.CompletedTask;
    }
}

并在 Startup 中注册此过滤器提供程序:

services.TryAddEnumerable( ServiceDescriptor.Singleton<IFilterProvider, AutoSkipAntiforgeryFilterProvider>());

现在它将绕过AntiForgery即使有一个[ValidateAntiForgeryToken]属性。


[Demo]

假设我们有一个带有注释的操作方法[ValidateAntiForgeryToken]:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("Id,Name")] XModel xModel)
{
    ....
}

通常,它会使用 CSRF 令牌来保护此方法。但如果您发送如下请求:



POST /XModels/Create HTTP/1.1
Authorization: Bearer Xyz 
Content-Type: application/x-www-form-urlencoded

...
  

它不会验证 csrf 令牌。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET Core 3.1 中实现自定义 ValidateAntiforgeryTokenAuthorizationFilter 的相关文章

随机推荐

  • `script` 和 `link as="script"` 标签有什么区别?

    除了加载脚本的标准方法之外 我见过人们这样做 有什么区别吗 注 还有一个类似的使用 link 和 script 标签引用 JavaScript 源代码有什么区别 问题询问关于 这是不同的 If that link标签有rel preload
  • 如何禁用谷歌浏览器自动更新? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 有谁知道如何禁用 Google Chrome 自动更新本身 它会导致我的网络应用程序总是发生变化 我已尝试使用此页面上提供的或如中所述的 Google Update ADM 模板这篇
  • 将MaterialToolbar的标题更改为center

    我正在使用导航组件和材质工具栏 我刚刚使用材质工具栏设置了导航组件 通过这样做 每当片段更改显示的后退按钮时 导航组件就会自动更改材质工具栏的标题 问题是我只想将标题重力更改为中心而不删除那些导航组件工具栏支持 我怎样才能做到这一点 注意
  • 如何配置 rspec 以使用 spork 显示输出?

    我运行了 spork 来加速我的测试 但是当我运行它们时没有输出 是否有我需要修改的配置 刚刚也遇到了这个问题 在 spork 1 0 0rc4 和 rspec 2 14 1 rspec core 2 14 8 上运行 据我所知 问题在于以
  • 时间戳和日期时间

    我有一个包含两列的表 第一列是 当前日期 时间戳 另一列是 日期返回 日期时间列 我需要从天数中获取当前日期和日期返回之间的差异 这可能吗 不 这是不可能的 与流行的看法 以及名称本身 相反 timestamp column 实际上与时间无
  • “当前不会命中断点” - 我无法添加 .pdb 文件

    我在 Visual Studio 中有一个包含一个项目的解决方案2013 视觉C 但是当我构建它时debug模式 那么运行它debug我得到的模式 当前不会命中断点 尚未加载任何符号 对于本文档 我试图以类似于人们建议的 Visual C
  • Linux:有没有办法在不停止/暂停进程(SIGSTOP)的情况下使用 ptrace?

    我正在尝试将程序从 Windows 移植到 Linux 当我发现没有 真实 的时候 我遇到了一个问题ReadProcessMemoryLinux 上的对应项 我寻找替代方案 然后发现ptrace 一个强大的进程调试器 我快速用 C 编写了两
  • 在双精度和字节数组之间进行转换,以便通过 ZigBee API 传输?

    我正在尝试获取两个双精度数 GPS 坐标 并通过 ZigBee API 将它们发送到另一个 ZigBee 接收器单元 但我不知道如何将双精度数分解为字节数组 然后将它们重新组合回原始形式一旦他们被转移 基本上 我需要将每个双精度数转换为八个
  • 使用 PageView 时的 FadeTransition

    我试图做一些应该很简单的事情 但事实证明这非常困难 当用户滚动到 flutter web 上的下一页时 我试图进行淡入淡出过渡 我尝试使用在 stackoverflow 上找到的许多代码 但没有任何效果 我最后尝试的是以下代码 它给了我一个
  • 如何缓存bust sw-toolbox?

    我一直在玩弄服务人员和 sw toolbox 两者都是很好的方法 但似乎都有其弱点 我的项目开始时使用 Google 的 Service Worker 方法 link 我的看法是 您必须手动更新缓存清除的版本号 我也可能是错的 但我不认为用
  • 如何在不同服务器上的两个不同数据库之间复制或导入 Oracle 模式?

    从一个用户 实例 服务器复制架构的最佳方法是什么 jdbc oracle thin deeb02 1535 DH user pov 到另一个用户 实例 服务器 jdbc oracle thin 123 456 789 123 1523 or
  • 在history.push()之后组件没有被渲染

    单击按钮后 我将通过执行以下操作更改 URLhistory push import createHistory from history createBrowserHistory const history createHistory so
  • 如何在 bash 中等待多个子进程完成,并在任何子进程以代码 !=0 结束时返回退出代码 !=0?

    如何在 bash 脚本中等待从该脚本生成的多个子进程完成 然后返回退出代码 0当任何子进程以代码结束时 0 简单的脚本 bin bash for i in seq 0 9 do doCalculations i done wait 上面的脚
  • R:因子水平,将其余部分重新编码为“其他”

    我很少使用因子 通常认为它们是可以理解的 但我经常对特定操作的细节感到模糊 目前 我正在将很少观察到的类别编码 折叠到 其他 中 并正在寻找一种快速的方法来做到这一点 我有一个变量的大约 20 个级别 但有兴趣将其中一堆折叠为一个 data
  • django 中的完全外连接

    如何使用 django QuerySet API 创建跨 M2M 关系的完整外部联接的查询 如果不支持 欢迎一些有关创建我自己的经理来执行此操作的提示 编辑添加 S 洛特 感谢您的启发 对 OUTER JOIN 的需求来自于应用程序 它必须
  • 如何创建具有多种视图类型的RecyclerView

    From 使用 RecyclerView 创建动态列表 当我们创建一个RecyclerView Adapter我们必须指定ViewHolder将与适配器绑定 public class MyAdapter extends RecyclerVi
  • 读取JRT后如何释放所有资源?

    我正在尝试使用中描述的方法读取给定 Java 9 安装中可用的模块列表 给定其 Java Home 如何提取文件 jre 9 lib modules 该解决方案有效 但分配用于读取 Java 运行时映像内容的资源似乎永远不会释放 从而导致内
  • 生成由文件输入在特定时间选择的视频文件的缩略图/快照

    如何抓取通过以下方式选择的视频文件的快照
  • 如何在asp.net中的gridview中创建链接

    我正在尝试创建一个具有网格视图的网页 这个 gridview 应该有一个如下所示的链接 http localhost Test aspx code 123 当用户单击 gridview 中的某一行链接时 它将打开一个空白页面并显示一些结果
  • 如何在 ASP.NET Core 3.1 中实现自定义 ValidateAntiforgeryTokenAuthorizationFilter

    我想实现一个过滤器 当身份验证令牌身份验证时 该过滤器会跳过防伪令牌的验证 Bearer 用来 在 ASP NET Core 2 2 中ValidateAntiforgeryTokenAuthorizationFilter and Auto