【发布时间】:2021-07-19 09:26:57
【问题描述】:
我有一个带有承载身份验证的 aspnet 核心 MVC 项目(令牌是从另一个 api 接收的)。
services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultForbidScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, config =>
{
config.Authority = configuration["TokenServerUrl"];
config.Events = new JwtBearerEvents
{
OnMessageReceived = context =>
{
context.Token = context.HttpContext.Request.Cookies["access_token"];
return Task.CompletedTask;
},
};
});
我需要在未经授权的请求时重定向到登录页面,所以我找到了 UseStatusCodePages() 方法。 奇怪的是 UseStatusCodePages 必须放在授权中间件之前:
app.UseStatusCodePages(context =>
{
var response = context.HttpContext.Response;
if (response.StatusCode == (int)HttpStatusCode.Unauthorized ||
response.StatusCode == (int)HttpStatusCode.Forbidden)
{
response.Redirect("/Account/Login");
}
return Task.CompletedTask;
});
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
"default",
"{controller=Home}/{action=Index}/{id?}");
});
我想,UseAuthentication中间件返回401然后就可以处理了。那么如果 UseStatusCodePages 中间件放在 UseAuthentication 之前,它如何处理 401 代码呢?如果我将 UseStatusCodePages 放在 UseAuthorization 之后 - 它根本不会被调用,这很奇怪。任何人都可以解释这种行为吗?
【问题讨论】:
标签: asp.net-core