Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何捕获反伪造异常并重定向到错误页面_C#_Asp.net Core - Fatal编程技术网

C# 如何捕获反伪造异常并重定向到错误页面

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

我正在迁移到.Net Core,但我不知道如何处理防伪令牌异常。这就是我想在.Net Core中重新创建的内容(Global.asax.cs,Application_Error()方法):

我首先向Startup.cs添加了以下内容:

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