我在asp.net核心网络应用中使用Cookie身份验证。默认行为是,如果用户未通过身份验证并尝试访问需要身份验证的用户的某些页面,则将其重定向到登录页面,并将URL参数ReturnUrl
设置为首先请求的页面。
如果用户已通过身份验证并尝试访问未经授权的页面,则默认情况下,该页面将被重定向到/Account/AccessDenied
。
因为我想在应用程序中实现一些自定义的异常和状态代码处理,所以我需要让我的Web应用程序返回403
(如果用户未获得授权(但已通过身份验证)),而不仅仅是重定向到{{ 1}}。我进行了一些研究,发现您可以为/Account/AccessDenied
定义一个自定义委托,而我曾经忽略了该重定向,而只返回了OnRedirectToAccessDenied
:
403
现在,这可以按预期工作,并且我收到services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToAccessDenied = context =>
{
context.Response.StatusCode = 403;
return Task.CompletedTask;
};
});
用于经过身份验证但未经授权的用户。但是现在,未经身份验证的用户的自动重定向到登录页面的操作停止了(实际上只是通过添加此自定义委托)。未经身份验证的用户也将收到403
。因此,我更改了代表以处理这种情况:
403
这也可以按预期工作,但感觉有些古怪。我想依靠未经身份验证的用户的默认行为,但是找不到在这种情况下正确方法的方法。
我应该如何以正确的方式处理这种情况,我只想为经过身份验证但未经授权的用户返回services.ConfigureApplicationCookie(options =>
{
options.Events.OnRedirectToAccessDenied = context =>
{
if (context.HttpContext.User.Identity.IsAuthenticated)
{
context.Response.StatusCode = 403;
}
else
{
context.Response.Redirect($"{options.LoginPath}?ReturnUrl={context.Request.Path}");
}
return Task.CompletedTask;
};
});
,但将未经身份验证的用户重定向到登录页面?
我想要这种行为的原因是因为我正在403
中注册UseStatusCodePagesWithReExecute
中间件,以便能够自定义不同状态代码的处理:
startup