gpt4 book ai didi

c# - AntiForgeryToken 到期空白页

转载 作者:可可西里 更新时间:2023-11-01 09:09:45 28 4
gpt4 key购买 nike

我在 ASP.NET Core 2.2 中使用 IdentityServer4。在登录后方法上,我应用了 ValidateAntiForgeryToken。通常在登录页面上停留 20 分钟到 2 小时后,然后尝试登录会生成一个空白页面。

如果您查看 Postman 控制台,您会收到一条 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使 ValidateAntiforgeryTokenAuthorizationFilter 内部化。现在我们必须复制粘贴 their code ,才能得出。但很可能我们不需要。要仅更改结果行为,我们所需要做的就是测试 IAntiforgeryValidationFailedResult 的上下文并相应地继续,如 example 中所述。 .

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)
{ }
}
}

然后在 Controller 中:

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

涵盖 .net core 2.2 的原始答案

还有一个使用默认实现的实现,包括所有预检查、日志记录等。它仍然是一个 AuthorizationFilter,因此可以防止任何进一步的操作执行。唯一的区别是它触发 HttpGet 到相同的 url 而不是默认的 400 响应,一种 Post/Redirect/Get 模式实现。

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);
}
}
}

关于c# - AntiForgeryToken 到期空白页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56295076/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com