UseStatusCodePagesWithReExecute无法处理禁止访问(403)状态码。

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

enter image description here

当我将403作为http结果代码时,UseStatusCodePagesWithReExecute的工作方式不如预期。不知何故,它的工作方式就像我已经指定了UseStatusCodePagesWithRedirects一样。

enter image description here

我需要UseStatusCodePagesWithReExecute的行为适用于400-600范围内的所有状态代码,包括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();
}

2
UseStatusCodePagesWithReExecute无法检测到403,因为当它通过中间件返回时,它不是403。它是302,因此超出了400-600的范围。 - Kirk Larkin
我现在正在尝试覆盖CookieAuthenticationandler上的那个行为。 - Oğuzhan Topçu
2
你可以使用OnRedirectToAccessDenied来实现。如果需要帮助请告诉我。 - Kirk Larkin
1个回答

3

感谢@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;
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接