Я использую аутентификацию cookie в основном веб-приложении asp.net.Поведение по умолчанию состоит в том, что если пользователь не аутентифицирован и пытается получить доступ к какой-либо странице, для которой требуется аутентифицированный пользователь, он перенаправляется на страницу входа с параметром URL ReturnUrl
, установленным на страницу, запрошенную в первую очередь.
Еслипользователь проходит проверку подлинности и пытается получить доступ к странице, на которую у него нет полномочий, поскольку он по умолчанию перенаправляется на /Account/AccessDenied
.
Поскольку я хочу внедрить в приложение некоторую пользовательскую обработку исключений и кодов состояния, мне нужномое веб-приложение возвращает 403
, если пользователь не авторизован (но аутентифицирован), а не просто перенаправляет на /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
для возможности настройки обработки различных кодов состояния:
app.UseStatusCodePagesWithReExecute("/Error/{0}");