авторизация /аутентификация в asp.net (core)
- Алик Ким
- 23 сент.
- 2 мин. чтения
немножко поразбирался, как работает авторизация в asp.net core. а то не было полной картины в голове. итак:
схема авторизации - это что-то вроде названия этапа авторизации.
этапы есть такие:
- аутентификация - попытка чтения ранее сохраненной информации о текущем пользователе (в случае куки-обработчика - чтение и расшифровка куки, десериализация в User; в случае JWT-обработчика - чтение инфы из JWT-заголовка, его расшифровка и десериализация). происходит каждый раз при обработке запроса (если авторизация добавлена приложение).
- challenge - процесс аутентификации. запускается в случае попытки доступа к авторизованному ресурсу неаутентифицированным пользователем. или может вызываться вручную (ссылка "залогиниться"). в обоих случаях это - некий процесс, итогом которого будет вызов HttpContext.SignInAsync, которому параметром передается созданный программно ClaimsPrincipal (кстати, "Challenge" в Asp.net - это чуть другое, чем Challenge в HTTP)
- Sign In - начинается после вызова HttpContext.SignInAsync. может иметь своего отдельного обработчика. в случае с куки-обработчиком - шифруется (подписывается?) и сохраняется в куки. JWT-обработчик Challenge и SignIn не поддерживают, в этом случае просто вернется 401 на этапе challenge.
- есть еще SignOut, вызывается нами программно. наверное, не имеет смысл для него иметь другого обработчика, чем имеет SignIn.
хмм, получается, этап SignIn по факту используется только куки-провайдером сейчас (ну, кроме какой то экзотики и чего нибудь самописного))
цель всего этого процесса - заполнить объект ClaimsPrincipal - чтото типа синглтона для текущего запроса, который доступен через Controller.User, на который потом и смотрим авторизация.
на этот объект мы можем смотреть программно, так же туда смотрят атрибуты типа [Authorize] на контроллере или действии.
обработчики этапов настраиваются через опции AddAuthentication
например, "options.DefaultChallengeScheme = GoogleDefaults.AuthenticationScheme" - задает для этапа челленджа гугл. при чем GoogleDefaults.AuthenticationScheme - это строковая константа, определяемая самим провайдером (не копал, как это работает под капотом)
DefaultScheme - единая настройка для всех этапов (используется, если настройка конкретного этапа не задана)
ClaimsPrincipal реализует интерфейс IPrincipal. видимо, когда то раньше предполагалось, что будут разные его реализации. но сейчас в ControllerBase свойство User прям имеет тип ClaimsPrincipal. так что, наверное, на эту абстракцию можно смело забивать, смело приводить типы, если где то встретится IPrincipal


Комментарии