当我指定 404 作为 http 结果代码时,UseStatusCodePagesWithReExecute
正在按预期工作。
![enter image description here](https://i.stack.imgur.com/q6lrw.png)
当我指定 403 作为 http 结果代码时,UseStatusCodePagesWithReExecute
没有按预期工作。不知怎的,它就像我指定的那样工作UseStatusCodePagesWithRedirects
.
![enter image description here](https://i.stack.imgur.com/laD2p.png)
我需要的行为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();
}
弄清楚了,感谢@Kirk
将此代码添加到AddCookie
就可以了。
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.StatusCode = 403;
return Task.CompletedTask;
};
这是原始的事件处理程序方法,我不在乎Location
header,所以我省略了相关代码,你可能不想。
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;
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)