AntiForgeryToken 过期空白页

2024-02-03

我将 IdentityServer4 与 ASP.NET Core 2.2 一起使用。在“登录后”方法中,我应用了 ValidateAntiForgeryToken。通常,在登录页面停留 20 分钟到 2 小时后尝试登录,会出现一个空白页面。

如果您查看 Postman Console,您会收到 400 Bad Request 消息。然后,我将 AntiForgery 选项上的 Cookie 过期时间设置为 90 天。我允许该页面停留长达 6 小时并且仍然可以登录。然而,大约 8 小时(过夜)后,我在尝试登录后再次收到空白页面。

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login
services.AddAntiforgery(options =>
{
    options.Cookie.Expiration = TimeSpan.FromDays(90);
});

我希望能够在登录页面停留 90 天,这是 cookie 的持续时间,但这不起作用。如何让 AntiforgeryToken 的 cookie 持续整个 90 天或我设置的任何时间并且不会超时或过期?有没有办法捕获此错误并将用户重定向回登录方法?


更新 '2021

从 ASP.Net Core 3.0 MS 开始decided https://github.com/dotnet/aspnetcore/issues/22947使ValidateAntiforgeryTokenAuthorizationFilter内部的。现在我们必须复制粘贴他们的代码 https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/Mvc.ViewFeatures/src/Filters/ValidateAntiforgeryTokenAuthorizationFilter.cs,能够推导出来。但很可能我们不需要。要改变结果行为,我们需要的只是测试上下文IAntiforgeryValidationFailedResult并按照本中所述进行相应操作example https://github.com/dotnet/aspnetcore/blob/master/src/Mvc/test/WebSites/BasicWebSite/Filters/RedirectAntiforgeryValidationFailedResultFilter.cs.

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Core.Infrastructure;
using Microsoft.AspNetCore.Mvc.Filters;

namespace BasicWebSite.Filters
{
    public class RedirectAntiforgeryValidationFailedResultFilter : IAlwaysRunResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is IAntiforgeryValidationFailedResult result)
            {
                context.Result = 
                    new RedirectResult("http://example.com/antiforgery-redirect");
            }
        }

        public void OnResultExecuted(ResultExecutedContext context)
        { }
    }
}

然后在控制器内:

// POST: /Antiforgery/LoginWithRedirectResultFilter
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
[TypeFilter(typeof(RedirectAntiforgeryValidationFailedResultFilter))]
public string LoginWithRedirectResultFilter(LoginViewModel model)
{
    return "Ok";
}

原始答案涵盖.net core 2.2

另一种实现使用默认的实现,包括所有预检查、日志记录等。它仍然是一个AuthorizationFilter,从而阻止任何进一步的操作执行。唯一的区别是它会触发HttpGet到相同的 url 而不是默认的 400 响应,这是一种发布/重定向/获取模式实施。

public class AnotherAntiForgeryTokenAttribute : TypeFilterAttribute
{
    public AnotherAntiForgeryTokenAttribute() : base(typeof(AnotherAntiforgeryFilter))
    {
    }
}


public class AnotherAntiforgeryFilter:ValidateAntiforgeryTokenAuthorizationFilter,
    IAsyncAuthorizationFilter
{
    public AnotherAntiforgeryFilter(IAntiforgery a, ILoggerFactory l) : base(a, l)
    {
    }

    async Task IAsyncAuthorizationFilter.OnAuthorizationAsync(
        AuthorizationFilterContext ctx)
    {
        await base.OnAuthorizationAsync(ctx);

        if (ctx.Result is IAntiforgeryValidationFailedResult)
        {
            // the next four rows are optional, just illustrating a way
            // to save some sensitive data such as initial query
            // the form has to support that
            var request = ctx.HttpContext.Request;
            var url = request.Path.ToUriComponent();
            if (request.Form?["ReturnUrl"].Count > 0)
                url = $"{url}?ReturnUrl={Uri.EscapeDataString(request.Form?["ReturnUrl"])}";

            // and the following is the only real customization
            ctx.Result = new LocalRedirectResult(url);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AntiForgeryToken 过期空白页 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • Spring Boot 关闭钩子

    如何注册 添加在 Spring Boot 应用程序关闭时触发的自定义关闭例程 场景 我将 Spring Boot 应用程序部署到 Jetty servlet 容器 即没有嵌入式 Jetty 我的应用程序使用 Logback 进行日志记录 并
  • 夏令时持续时间

    我有一个对象Shift 有两个字段 startDateTime and endDateTime as DateTime来自乔达时间 我的轮班包括英国夏令时的变化 它开始于25 03 2017 13 00并结束于26 03 2017 02 0
  • 如何在C#中动态阻止网站?

    我想从用 C 编写的 Windows 服务动态阻止某些 URL 我不想通过写入主机文件来做到这一点 例如我想阻止该网址http example com 在所有浏览器中 但也会阻止http example com another早上 7 点到
  • Objective C /C 中的命名约定,以“_”开头?

    我看到 ppl 定义变量是这样的 b2World world b2Body body CCSprite ball 代替 b2World world b2Body body CCSprite ball 我熟悉第二个 但不熟悉第一个 于是 我查
  • css 显示:表格第一列太宽

    我有一个像这样的 css 表设置 div class table div span name span span details span div div 表格的 css 是 table display table width 100 ta
  • 获取 PrintDialog 的模式对话框句柄

    我在 net 2 0 上有一个 Windows 应用程序 在Form1 我打开一个PrintDialog 如何从我的代码中获取该对话框的句柄 我尝试了很多win32功能 EnumWindows EnumChildWindows FindWi
  • 如何禁用 React JS 应用程序的源映射

    我的反应文件夹结构如下 我没有使用过 create react app 版本 我尝试使用GENERATE SOURCEMAP false 但这没有用 在哪里可以找到 map 文件 我怎样才能删除这些文件 我找不到构建文件夹 我尝试使用下面的
  • 如果名称和日期匹配两个 API JSON 数据,如何求和?

    有两个 API 请求 URL 这是第一个 API 请求 URL 和数据来自 http 127 0 0 1 8000 api onlineUserData onlineUserData Month Amania Shyral Dorpan N
  • 将 XML 发布到经典 asp 页面并检索页面上的发布数据

    为了在经典的 ASP 页面上发布数据 我使用下面的代码 Dim stringXML httpRequest postResponse stringXML
  • 异常与验证

    我刚刚遇到一个捕获异常的属性设置器 所有异常 我知道这很糟糕 但与这里无关 并且only记录它们 首先 我认为也应该通过他们 当您可以立即知道出现问题时 为什么要等待崩溃和日志研究呢 然而 我的主要问题是 我是否要验证无效的日期值 将 Ru
  • Highcharts:图表无法通过缩小屏幕来正确调整大小

    我正在使用 HighCharts 4 0 4 并且我有一个带有自定义图例的图表 如下所示 div class wrapper div class element div div div div class legend Legend div
  • 找不到tools.jar。请检查 /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home 是否包含有效的 JDK 安装

    FAILURE Build failed with an exception What went wrong Execution failed for task react native linear gradient compileDeb
  • 按下键盘上的“完成”时如何不关闭键盘

    当用户按下软键盘上的 完成 时 键盘关闭 我希望它只有在特定条件成立时才会关闭 例如 密码输入正确 这是我的代码 在按下 完成 按钮时设置监听器 final EditText et EditText findViewById R id et
  • 了解 Ruby on Rails ActiveRecord 模型访问器

    我的模型 DataFile 有一堆我想从模型外部设置的字段 例如 file DataFile new file owner 123 现在 据我所知 我必须在模型中为我想从外部修改的每个字段放置一个 attr accessor field 然
  • 在 PHP 中组织小函数的正确方法

    我有一堆小实用程序PHP我根据自己的情况为解决不同的脚本问题而创建的函数 像 UUID 和 trackUserActivity 等函数 这些函数有很多并且每天都在增加 假设我有大约 50 个不同的小函数 并为我的应用程序获得了大约 100
  • 将动态 URL 绑定到 FB,就像 angular2 中的按钮一样

    我正在尝试将动态 URL 绑定到像这样的按钮的 facebook 页面 div div div class fb like div 但根据此处的文档 Facebook 似乎在数据实际到来之前就获得了默认页面链接 https develope
  • R 列数

    我想使用ave在数据框上的许多列 数十列 上运行的函数 ave df the cols df c site month FUN mean 问题是ave运行mean作用于所有the cols列在一起 有什么方法可以为每个运行它the cols
  • Maven 编译器插件配置了 Java 7 但仍然编译 Java 8 代码

    在我的项目中 我们将使用 Java 7maven compiler plugin并且我们假设在 Maven 编译后 所有使用 Java 8 的代码都不应编译成功 但是 就我而言 有一个文件使用Arrays stream T array 它可
  • 在 C# 中使用 Microsoft Office Interop Word 的文档中的不同首页

    如何使用 Microsoft office interop word 在文档中创建不同的首页页眉和页脚 我尝试过以下代码 但仅在第一页中出现页眉和页脚 我想要以另一种方式 首页不应该有页眉和页脚 谁能帮帮我吗 我尝试了很多 Microsof
  • AntiForgeryToken 过期空白页

    我将 IdentityServer4 与 ASP NET Core 2 2 一起使用 在 登录后 方法中 我应用了 ValidateAntiForgeryToken 通常 在登录页面停留 20 分钟到 2 小时后尝试登录 会出现一个空白页面