Каково поведение по умолчанию при нарушении атрибута авторизации в ASP.NET Ядро

#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, не устанавливает это. Если ничего не установлено в автоматическое, ничего не произойдет вообще, когда вы столкнетесь с атрибутом авторизации.