Академический Документы
Профессиональный Документы
Культура Документы
N E T
Authentication & Authorization (Cookie, JWT)
Natalja Ivleva
Аутентификация
Аутентификация (от греческого: αυθεντικός ; реальный или подлинный): подтверждение подлинности чего-
либо или кого либо.
Авторизация
Авторизация является функцией определения прав доступа к ресурсам и управления этим доступом.
Пароли
2 Хэширование хэша
Техника хэширования пароля несколько раз. То есть вычисляется хэш от хэша от хэша от хэша… и так n раз
MD5
SHA1
5
Типы аутентификации
HTTP Basic При использовании данного вида аутентификации имя пользователя и пароль включаются в состав веб-
запроса (HTTP POST или HTTP GET). Логин и пароль упаковываются в Base64 и отправляются на сервер
Authentication для проверки. Самая распространенная — угроза man-in-the-middle attack
HTTP Digest Это аутентификация, при которой пароль пользователя передается в хешированном виде. Пароль
хешируется всегда с добавлением произвольной строки символов, которая генерируется на каждое
Authentication соединение заново. Используется MD5-хеш
При его использовании запрашиваемый сервис делегирует функцию проверки достоверности сведений о
To k e n B a s e d пользователе другому сервису. Т. е. провайдер услуг доверяет выдачу необходимых для доступа токенов
Authentication токен-провайдеру (Identity provider). OAuth2 & Open ID Connect
???
6
A S P. N E T
Аутентификация на основе Cookies
COOKIES
Ку́ки (англ. cookie) — небольшой фрагмент данных, отправленный веб-сервером и хранимый на компьютере
пользователя. Веб-клиент (обычно веб-браузер) всякий раз при попытке открыть страницу соответствующего
сайта пересылает этот фрагмент данных веб-серверу в составе HTTP-запроса.
Применяется для сохранения данных на стороне пользователя, на практике обычно используется для:
• аутентификации пользователя;
• хранения персональных предпочтений и настроек пользователя;
• отслеживания состояния сеанса доступа пользователя;
• статистики о пользователях.
• …
Wikipedia
A S P. N E T C o r e и C o o k i e s
ASP.NET Core имеет встроенную поддержку аутентификации на основе cookies.
• Для этого в ASP.NET определен специальный компонент middleware, который
сериализует данные пользователя в зашифрованные аутентификационные cookies
и передает их на сторону клиента.
• При получении запроса от клиента, в котором содержатся аутентификационные
cookies, происходит их валидация, десериализация и инициализация свойства User
объекта HttpContext.
П р и м е р – A S P. N E T M V C
10
1 . С озд а н и е Б Д
11
Code First
DbContext
База данных-WebCookiesDB
Role
User
appsettings.json
"ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=WebCookiesDB;Trusted_Connection=True;"
},
2.ConfigureServices
15
ConfigureServices
Startup.cs
ConfigureServices(2)
• Для установки аутентификации с помощью cookies в методе ConfigureServices в метод
services.AddAuthentication передается значение CookieAuthenticationDefaults.AuthenticationScheme.
• С помощью метода AddCookie() настраивается аутентификация - конфигурация объекта
CookieAuthenticationOptions, который описывает параметры аутентификации с помощью cookie:
• LoginPath – относительный путь, куда перенаправляются запросы, если не авторизированный
пользователь пытается получить доступ к ресурсу.
• AccessDeniedPath - сюда перенаправляются запросы, если не авторизированный пользователь
пытается получить доступ к ресурсу, но не использует никакой политики авторизации для этого
ресурса.
• ExpireTimeSpan - TimeSpan, после которого истечет срок действия куки. Оно привязано к текущей
дате и времени.
• ...
19
AccountController
Login Registration
20
Метод - Authenticate
21
Claims
• Утверждения (claims) представляют некоторую дополнительную информацию о
пользователе, которую можно использовать для авторизации в приложении.
• Утверждения обеспечивают гибкий подход к системе авторизации. В отличие от
ролей, утверждения авторизуют пользователя на основе информации, которая
описывает этого пользователя.
• Для создания claim в конструктор передается тип и значения.
• Например, тип ClaimsIdentity.DefaultNameClaimType фактически представляет логин. А userName,
в данном случае будет представлять значение, которое затем можно получить через выражение
User.Identity.Name
ClaimsIdentity
Claim ClaimsIdentity
Каждый объект claim представляет класс Claim, который Созданный объект ClaimsIdentity передается в конструктор
определяет следующие свойства: ClaimsPrincipal. И фактически этот объект ClaimsPrincipal и
будет представлять то, что потом в любом контроллере
• Issuer: "издатель" или название системы, которая выдала
можно получить через HttpContext.User.
данный claim
23
HttpContext.User
Для проверки статуса пользователя атрибут использует свойство User объекта HttpContext, которое
устанавливается инфраструктурой ASP.NET
Свойство HttpContext.User представляет объект интерфейса IPrincipal, который определен в пространстве
имен System.Security.Principal. Этот интерфейс определяет метод IsInRole() и свойство Identity.
User (HttpContext.User) фактически представляет объект ClaimsPrincipal.
Свойство Identity возвращает объект интерфейса IIdentity, который связан с текущим запросом.
Метод IsInRole() в качестве параметра принимает роль и возвращает true, если текущий пользователь
принадлежит данной роли.
Объект IIdentity, в свою очередь, предоставляет информацию о текущем пользователе через следующие
свойства:
• AuthenticationType: тип аутентификации в строковом виде
• IsAuthenticated: возвращает true, если пользователь аутентифицирован
• Name: возвращает имя пользователя. Как правило, в качестве подобного имени используется логин, по
которому пользователь входит в приложение
Claim и ClaimsIdentity
25
Создание/удаление cookies
26
AntiForgery
CSRF (Cross-Site Request Forgery «межсайтовая подделка запроса») - вид атак на посетителей веб-сайтов,
использующий недостатки протокола HTTP.
Атака осуществляется путём размещения на веб-странице ссылки или скрипта, пытающегося получить
доступ к сайту, на котором атакуемый пользователь заведомо (или предположительно) уже
аутентифицирован.
Защищаться должны все запросы, изменяющие данные на сервере, а также запросы, возвращающие
персональные данные.
Cпособом защиты является механизм, при котором с каждой сессией пользователя ассоциируется
дополнительный секретный уникальный ключ, предназначенный для выполнения запросов. Секретный ключ
не должен передаваться в открытом виде, например, для POST запросов ключ следует передавать в теле
запроса, а не в адресе страницы. Браузер пользователя посылает этот ключ в числе параметров каждого
запроса, и перед выполнением каких-либо действий сервер проверяет этот ключ.
Wikipedia
Примеры
28
Views
29
J W T ау те н т и ф и к а ц и я
30
JWT-токены
JWT (или JSON Web Token) представляет собой веб-стандарт, который определяет способ передачи данных
о пользователе в формате JSON в зашифрованном виде.
JWT-токен состоит из трех частей:
• Header - объект JSON, который содержит информацию о типе токена и алгоритме его шифрования
• Payload - объект JSON, который содержит данные, нужные для авторизации пользователя
• Signature - строка, которая создается с помощью секретного кода, Headera и Payload. Эта строка служит
для верификации токена
Первые два блока (header, payload) представлены в JSON-формате и дополнительно закодированы в формат
base64.
Набор полей содержит произвольные пары имя/значения, притом стандарт JWT определяет несколько
зарезервированных имен (iss, aud, exp и другие).
Сигнатура может генерироваться при помощи и симметричных алгоритмов шифрования, и асимметричных.
jwt.io
JWT-токены(2)
Токены предоставляют собой средство авторизации для каждого запроса от клиента к серверу.
Токены (и соотвественно сигнатура токена) генерируются на сервере основываясь на секретном ключе
(который хранится на сервере) и payload'e.
Токен в итоге хранится на клиенте и используется при необходимости авторизации како-го либо запроса.
33
JWT-токены(3)
34
JWT-токены(4)
2. Каждый блок отдельно сначала представляется в виде 2. Получаем имя алгоритма генерации цифровой подписи
массива байт, а затем кодируется в строку с из параметра alg.
использованием Base64.
3. Декодируем блок SIGNATURE из Base64-строки в массив
3. Результат записывается через точку: HEADER.PAYLOAD байт (получаем цифровую подпись).
4. Используя алгоритм, указанный в параметре alg, 4. Проверяем корректность подписи для строки:
генерируется цифровая подпись для строки HEADER.PAYLOAD
HEADER.PAYLOAD
5. В случае успешной проверки декодируем блок PAYLOAD
5. Цифровая подпись кодируется в строку с из Base64-строки в JSON объект с утверждениями.
использованием Base64 и является блоком SIGNATURE.
35
Принцип аутентификации с JWT
36
Startup.cs appsettings.json
37
Ус та н о в к а ау те н т и ф и к а ц и и
• Для установки аутентификации с помощью токенов в методе ConfigureServices в вызов
services.AddAuthentication передается значение JwtBearerDefaults.AuthenticationScheme.
• Далее с помощью метода AddJwtBearer() добавляется конфигурация токена, где
применяется объект JwtBearerOptions, который позволяет с помощью свойств настроить
работу с токеном.
• RequireHttpsMetadata: если равно false, то SSL при отправке токена не используется.
Однако данный вариант установлен только для тестирования. В реальном приложении все
же лучше использовать передачу данных по протоколу https.
• TokenValidationParameters: параметры валидации токена - сложный объект,
определяющий, как токен будет валидироваться.
• Этот объект в свою очередь имеет множество свойств, которые позволяют настроить
различные аспекты валидации токена. Но наиболее важные свойства: IssuerSigningKey -
ключ безопасности, которым подписывается токен, и ValidateIssuerSigningKey - надо ли
валидировать ключ безопасности.
38
Создание токена
39
Создание токена
40
П р и м е р – A S P. N E T C O R E W E B A P I
41
1 . С озд а н и е Б аз ы д а н н ы х . Vi e w M o d e l s
42
A S P. N E T I d e n t i t y
43
IdentityUser
В ASP.NET Core Identity пользователь представлен классом IdentityUser
• Id: уникальный идентификатор пользователя
• UserName: ник пользователя
• Email: электронный адрес пользователя
• Logins: коллекция логинов, которые использовались пользователем для входа через сторонние сервисы (Google,
Facebook и т.д.)
• Claims: коллекция клеймов или дополнительных объектов, которые используются для авторизации пользователя
• PasswordHash: хеш пароля. В базе данных напрямую не хранится пароль, а только его хеш.
• Roles: набор ролей, к которым принадлежит пользователь
• PhoneNumber: номер телефона
• SecurityStamp: некоторое специальное значение, которое меняется при смене аутентификационных данных,
например, пароля
• AccessFailedCount: количество неудачных входов пользователя в систему
• EmailConfirmed: подтвержден ли адрес электронной почты
• PhoneNumberConfirmed: подтвержден ли номер телефона
44
IdentityRole
По умолчанию роль в ASP.NET Core Identity представлена классом IdentityRole, который
определяет три свойства:
• Id: идентификатор роли
• Name: название роли
• Users: коллекция объектов IdentityUserRole, через которые пользователи ассоциированы с
данной ролью
45
Startup.cs
46
Менеджер пользователей UserManager
48
Контекст данных IdentityDbContext
Для работы с базой данных ASP NET Identity использует контекст данных, который наследуется
от класса IdentityDbContext
• Users: набор объектов IdentityUser, соответствует таблице пользователей
• Roles: набор объектов IdentityRole, соответствует таблице ролей
• RoleClaims: набор объектов IdentityRoleClaim, соответствует таблице связи ролей и объектов
claims
• UserLogins: набор объектов IdentityUserLogin, соответствует таблице связи пользователей с
их логинами их внешних сервисов
• UserClaims: набор объектов IdentityUserClaim, соответствует таблице связи пользователей и
объектов claims
• UserRoles: набор объектов IdentityUserRole, соответствует таблице, которая сопоставляет
пользователей и их роли
• UserTokens: набор объектов IdentityUserToken, соответствует таблице токенов пользователей
49
Пример
50
ViewModels
51
2 . С о з д а н и е к о н т р ол л е р а д л я а у т е н т и ф и к а ц и и
52
Web API приложение
Web API представляет собой веб-службу, к которой могут обращаться другие приложения. Причем эти
приложения могут представлять любую технологию и платформу - это могут быть веб-приложения,
мобильные или десктопные клиенты..
Контроллер Web API является наследником класса ApiController
Контроллеры Web API применяют стиль REST (Representation State Transfer или "передача состояния
представления").
REST-архитектура предполагает применение следующих методов или типов запросов HTTP для
взаимодействия с сервером:
• GET
• POST
• PUT
• DELETE
REST-стиль особенно удобен при создании Single Page Application, которые используют специальные
javascript-фреймворки типа Angular, React
53
Пример
54
Пример
55
3 . Те с т и р о в а н и е р а б от ы A p i C o n t r o l l e r
56
POSTMAN
Postman – это набор инструментов тестирования REST API
57
POSTMAN (2)
58
jwt.io
59
SWAGGER
Swagger — это фреймворк и спецификация для определения и документирования REST APIs
Swashbuckle — это проект с открытым исходным кодом для создания документов Swagger для веб-API,
построенных с помощью ASP.NET Core
PM > Install-Package Swashbuckle.AspNetCore
метод ConfigureServices
метод Configure
60
SWAGGER (2)
61
SWAGGER (3)
62
SWAGGER (4)
Добавление документации
63
SWAGGER и POSTMAN
Можно импортировать json который генерирует swagger в Postman
http://localhost:51168/swagger/v1/swagger.json
64
Клиентская часть(JQuery)
65
Клиентская часть(JQuery)-2
66
Клиентская часть(JQuery)-3
Страница Admin используется DataTable.js
67
Используемые источники
1. https://dotnet.today/ru/aspnet5-vnext/security/index.html
2. https://metanit.com/sharp/aspnet5/15.1.php
3. Microsoft Documentation
4. https://habr.com/en/company/ua-hosting/blog/429680/
5. https://habr.com/ru/company/acribia/blog/413157/
68
Спасибо за внимание
Вопросы?