C# 如何捕获反伪造异常并重定向到错误页面
我正在迁移到.Net Core,但我不知道如何处理防伪令牌异常。这就是我想在.Net Core中重新创建的内容(Global.asax.cs,Application_Error()方法): 我首先向Startup.cs添加了以下内容:C# 如何捕获反伪造异常并重定向到错误页面,c#,asp.net-core,C#,Asp.net Core,我正在迁移到.Net Core,但我不知道如何处理防伪令牌异常。这就是我想在.Net Core中重新创建的内容(Global.asax.cs,Application_Error()方法): 我首先向Startup.cs添加了以下内容: app.UseExceptionHandler("/Home/Error"); 它捕获空指针异常,但不捕获404错误或防伪令牌异常。所以我补充说: app.Use(async (context, next) => { await
app.UseExceptionHandler("/Home/Error");
它捕获空指针异常,但不捕获404错误或防伪令牌异常。所以我补充说:
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 400)
{
context.Request.Path = "/Error/HttpError400"; // <-- this code is reached but no redirect
await next();
}
else if (context.Response.StatusCode == 404)
{
context.Request.Path = "/Error/HttpError404";
await next();
}
});
为什么不使用
app.UseStatusCodePagesWithReExecute
将其添加到配置方法中,如下所示:
app.UseExceptionHandler(“/Error”);
app.UseStatusCodePagesWithReExecute(“/Error/{0}”);
添加一个错误控制器
,然后在控制器中:
[Route("Error/{statusCode}")]
public IActionResult ErrorHandler(int statusCode)
{
switch (statusCode)
{
case 404:
break;
case 500:
break;
case 400:
//Redirect
break;
default:
break;
}
return View("Error");
}
您可以实现ialwaysrunsultfilter
并评估内容结果。反伪造令牌异常返回特定的IActionResult
-IAntiforgeryValidationFailedResult
这是作为一个有用的代码示例提出的。您可以共享启动类的配置
方法代码吗?@FeiHan更新了这个问题。谢谢,但它不适用于防伪令牌异常。它没有到达控制器代码。@TomasoAlbinoni我刚刚测试了它,它捕获了400
,但没有捕获实际异常,因此您可以根据它生成400
但无法获取实际异常的事实重定向到反伪造异常。但是从你的问题来看,你想重定向到一个400
,上面这个例子就是这样做的。我不再管理这个代码了,但是谢谢你的建议。我希望它能帮助别人。
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAntiforgery antiforgery)
{
var supportedCultures = new[] { "en-US", "fr" };
var localizationOptions = new RequestLocalizationOptions().SetDefaultCulture(supportedCultures[0])
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
app.UseExceptionHandler("/Home/Error");
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 400)
{
context.Request.Path = "/Error/HttpError400";
await next();
}
else if (context.Response.StatusCode == 404)
{
context.Request.Path = "/Error/HttpError404";
await next();
}
});
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
app.UseCookiePolicy();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
app.Use(next => context =>
{
string path = context.Request.Path.Value;
if (
string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) ||
string.Equals(path, "/index.html", StringComparison.OrdinalIgnoreCase))
{
// The request token can be sent as a JavaScript-readable cookie,
// and Angular uses it by default.
var tokens = antiforgery.GetAndStoreTokens(context);
context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,
new CookieOptions() { HttpOnly = false });
}
return next(context);
});
}
[Route("Error/{statusCode}")]
public IActionResult ErrorHandler(int statusCode)
{
switch (statusCode)
{
case 404:
break;
case 500:
break;
case 400:
//Redirect
break;
default:
break;
}
return View("Error");
}