#c# #asp.net #asp.net-core
#c# #asp.net #asp.net-ядро
Вопрос:
Каково поведение по умолчанию при нарушении Authorize
атрибута в ASP.NET Ядро?
[Authorize(Roles = "Administrator")]
public ActionResult ShutDown()
{
}
Кажется, что он перенаправляет на /Account/AccessDenied
, если у пользователя недостаточно прав и /Account/Login
если пользователь еще не вошел в систему.
Я прав?
Я ничего не вижу об этом в документах.
Комментарии:
1. Найдено это — шаблоны MVC по умолчанию настроены на перенаправление ответов HTTP 401 на страницу входа, которая затем вернет вошедшего в систему пользователя на ранее неавторизованную страницу.
Ответ №1:
Это зависит от того, какое промежуточное программное обеспечение аутентификации вы используете.
Промежуточное программное обеспечение проверки подлинности на основе файлов cookie по умолчанию перенаправляет пользователя, не прошедшего проверку подлинности, в /Account/Login, а уже прошедшего проверку подлинности пользователя — в /Account/AccessDenied . Это поведение можно отключить, установив флаг AutomaticChallenge в параметрах промежуточного программного обеспечения, после чего он просто вернет ответ HTTP 401, когда пользователь не вошел в систему, или 403, когда пользователь вошел в систему, но не выполняет требования авторизации.
Промежуточное программное обеспечение JWT bearer будет возвращать только коды состояния 401 или 403.
Другие промежуточные программы могут вести себя по-разному, в зависимости от того, какой стандарт они пытаются реализовать.
Комментарии:
1. Как я могу проверить, какое промежуточное программное обеспечение действительно использует мой проект?
2. Вам нужно изучить свой startup.cs и выяснить это оттуда.
3. Я вижу
AddIdentity
там. И это все?4. ДА. Это использует файлы cookie, и, следовательно, применяется ответ cookie.
5. Я знаю это, потому что я просматриваю этот код. Похоже, что это нигде не задокументировано. Пожалуйста, сообщите о проблеме в репозитории документов aspnet. github.com/aspnet/Docs
Ответ №2:
Я подумал, что было бы полезно следовать коду и понимать, что происходит. Значение по умолчанию AuthenticationHandler
просто вернет 401 (не прошедший проверку подлинности) или 403 (запрещено). После этого, в зависимости от конфигурации вашего проекта, в конвейер будут добавлены различные обработчики аутентификации.
- Например, когда вы используете
AddIdentity
иUseIdentity
, вы также вызываетеUseCookieAuthentication
за кулисами, что, в свою очередь, добавляетCookieAuthenticationMiddleware
. - Обработчик
CookieAuthenticationMiddleware
по умолчанию будет заменен обработчиком по умолчаниюCookieAuthenticationHandler
, хотя по умолчанию предыдущий обработчик будет сохранен как предыдущий обработчик. Таким образом, обработчики могут решить не участвовать и позволить предыдущему обработчику обработать результат. (Это важно для понимания того, какAutomaticChallenge
работает флаг) - Перенаправление
CookieAuthenticationHandler
будет перенаправлено наAccessDeniedPath
илиLoginPath
, которые взяты из параметров. По умолчанию эти пути являются/Account/Login
и/Account/AccessDenied
, но они могут быть переопределены идентификатором при вызове UseCookieAuthentication . (Переопределяется только LoginPath, но используется то же значение). - Вы также можете вручную обновить эти пути, например:
services.AddIdentity<ApplicationUser, IdentityRole>(opts => opts.Cookies.ApplicationCookie.LoginPath = new PathString("/Account/my-login"));
AutomaticChallenge
Флаг, упомянутый @blowdart, по умолчанию устанавливается как true, когда Identity добавляет промежуточное программное обеспечение для авторизации файлов cookie. Если вы установите это значение как false, обработчик файлов cookie не будет участвовать, и будет выполнен предыдущий обработчик, возвращающий 401 или 403. (Поскольку предыдущий обработчик будет по умолчанию использоваться по умолчанию)
services.AddIdentity<ApplicationUser, IdentityRole>(opts =>
opts.Cookies.ApplicationCookie.AutomaticChallenge = false);
Комментарии:
1. Чтобы быть строгим в этом, промежуточное ПО cookie, независимо от того, добавлено ли оно с помощью identity или вручную, будет иметь набор AutomaticChallenge. Ни одно из других промежуточных программ, поставляемых MSFT, не устанавливает это. Если ничего не установлено в автоматическое, ничего не произойдет вообще, когда вы столкнетесь с атрибутом авторизации.