【问题标题】:UseStatusCodePagesWithReExecute is not working for forbidden (403)UseStatusCodePagesWithReExecute 不适用于禁止 (403)
【发布时间】:2019-11-14 01:24:00
【问题描述】:

当我将 404 指定为 http 结果代码时,UseStatusCodePagesWithReExecute 按预期工作。

当我将 403 指定为 http 结果代码时,UseStatusCodePagesWithReExecute 无法正常工作。不知何故,它就像我指定的 UseStatusCodePagesWithRedirects 一样工作。

对于 400-600 范围内的所有状态码,我需要 UseStatusCodePagesWithReExecute 的行为,包括 403。

配置代码:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    //...
    services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
            {
                options.Cookie.HttpOnly = true;
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
                options.Cookie.SameSite = SameSiteMode.None;
                options.AccessDeniedPath = new PathString("/error/403/");
                options.LoginPath = "/account/signinrouter/";
            });
    //...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
    //...
    app.UseStatusCodePagesWithReExecute("/error/{0}");
    //...
}

动作代码:

public IActionResult NotFound()
{
    return base.NotFound();
}

public IActionResult Forbidden()
{
    return base.Forbid();
}

【问题讨论】:

  • UseStatusCodePagesWithReExecute 没有检测到 403,因为当它通过该中间件返回时,它不是 403。它是 302,因此在 400-600 范围之外。
  • 我现在正试图在 CookieAuthenticationandler 上覆盖该行为。
  • 您可以使用OnRedirectToAccessDenied 做到这一点。如果您需要帮助,请告诉我。

标签: c# asp.net-core error-handling


【解决方案1】:

想通了,感谢@Kirk

将此代码添加到AddCookie 就可以了。

options.Events.OnRedirectToAccessDenied = context =>
{
    context.Response.StatusCode = 403;

    return Task.CompletedTask;
};

这是原来的事件处理方法,我不关心Location标头,所以我省略了相关代码,你可能不想。

public Func<RedirectContext<CookieAuthenticationOptions>, Task> OnRedirectToAccessDenied { get; set; } = (Func<RedirectContext<CookieAuthenticationOptions>, Task>) (context =>
{
    if (CookieAuthenticationEvents.IsAjaxRequest(context.Request))
    {
    context.Response.Headers["Location"] = (StringValues) context.RedirectUri;
    context.Response.StatusCode = 403;
    }
    else
    context.Response.Redirect(context.RedirectUri);
    return Task.CompletedTask;
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2019-08-24
    • 2013-02-09
    • 2012-07-29
    • 2012-01-08
    • 2017-01-20
    • 2019-06-07
    相关资源
    最近更新 更多