UseStatusCodePagesWithReExecute не работает для запрещенных (403) - PullRequest
1 голос
/ 03 июля 2019

Когда я указываю 404 в качестве http-кода результата, UseStatusCodePagesWithReExecute работает как ожидалось.

enter image description here

Когда я указываю 403 в качестве http-кода результата, UseStatusCodePagesWithReExecute работает не так, как ожидалось. Каким-то образом это работает, как я указал UseStatusCodePagesWithRedirects.

* +1012 *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();
}

1 Ответ

1 голос
/ 03 июля 2019

Разобрался, благодаря @ 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;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...