Вы находитесь на странице: 1из 69

A S P.

N E T
Authentication & Authorization (Cookie, JWT)

Natalja Ivleva

TalTech Virumaa kolledž


Аутентификация и авторизация

Аутентификация
Аутентификация (от греческого: αυθεντικός ; реальный или подлинный): подтверждение подлинности чего-
либо или кого либо.

Авторизация
Авторизация является функцией определения прав доступа к ресурсам и управления этим доступом.
Пароли

Есть ли что -нибудь лучше для аутентифик ации, чем пароли ?

Пароль является «общим секретом» для пользователя и сервера.


Защита паролей

1 Шифрование Хэширование MD5, SHA1, SHA256, SHA512, PBKDF2, BCrypt…


• Трудоемкость. Шифрование занимает больше времени
• Длина выходных значений. Результат шифрования имеет переменную длину, результат хэширования – всегда одинаковую
• Управление ключами. Для шифрования требуется ключ
• Возможность коллизии. Постоянная длина хэша - ограниченность множества выходных значений хэш-функции, что приводит к возможности коллизии.

2 Хэширование хэша
Техника хэширования пароля несколько раз. То есть вычисляется хэш от хэша от хэша от хэша… и так n раз

3 Д обавить соль по вкусу


Соль – это дополнительная случайная строка, которая приписывается к паролю и хэшируется вместе с ним
1. По принципу соления: 2. По методу хранения соли:
• уникальная соль для каждого пользователя • в базе данных
• глобальная соль • в программном коде (конфигурационном файле)
• и то, и другое
4
Примеры

Хеширование пароля Хеширование хеша Д обавление с оли

MD5

SHA1

5
Типы аутентификации
HTTP Basic При использовании данного вида аутентификации имя пользователя и пароль включаются в состав веб-
запроса (HTTP POST или HTTP GET). Логин и пароль упаковываются в Base64 и отправляются на сервер
Authentication для проверки. Самая распространенная — угроза man-in-the-middle attack

HTTP Digest Это аутентификация, при которой пароль пользователя передается в хешированном виде. Пароль
хешируется всегда с добавлением произвольной строки символов, которая генерируется на каждое
Authentication соединение заново. Используется MD5-хеш

Aутентификация происходит на более высоком уровне модели абстракции. HTTP-сервер перенаправляет


Forms неаутентифицированного пользователя на другую страницу (login), после заполнения формируется POST-
запрос с данными и через защищенный канал направляется на сервер. Серверная сторона возвращает
Authentication пользователю токен или идентификатор сессии, который сохраняется в Cookies и в дальнейшем
используется для доступа к защищенному ресурсу.

При его использовании запрашиваемый сервис делегирует функцию проверки достоверности сведений о
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

1 Создание Базы данных. ViewModels

2 ConfigureServices настройк а аутентифик ации

3 Создание к онтроллеров для аутентифик ации

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, после которого истечет срок действия куки. Оно привязано к текущей
дате и времени.
• ...

CookieAuthenticationOptions Class (Link)


Пользовательская политика

• Авторизация, основанная на пользовательской политике, позволяет создать многократно используемую и


легко тестируемую структуру для авторизации.
• Политика авторизации состоит из одного или нескольких требований и регистрируется при запуске
приложения как часть конфигурации сервиса авторизации, расположенной в ConfigureServices()
• Политики применяются с помощью атрибута Authorize
3 . С озд а н и е к о н т р ол л е р о в

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

• Subject: возвращает информацию о пользователе в виде


объекта ClaimsIdentity

• Type: возвращает тип объекта claim

• Value: возвращает значение объекта 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

Свойства и методы Claim Свойства и методы ClaimsIdentity


• Identity: возвращает объект ClaimsIdentity, который Claims: свойство, которое возвращает набор
реализует интерфейс IIdentity и представляет текущего ассоциированных с пользователем объектов claim
пользователя
AddClaim(claim): добавляет для пользователя объект claim
• FindAll(type) / FindAll(predicate): возвращает все
AddClaims(claims): добавляет набор объектов claim
объекты claim, которые соответствуют определенному
типу или условию FindAll(predicate): возвращает все объекты claim, которые
соответствуют определенному условию
• FindFirst(type) / FindFirst(predicate): возвращает
первый объект claim, который соответствуют HasClaim(predicate): возвращает значение true, если
определенному типу или условию пользователь имеет claim, соответствующий определенному
условию
• HasClaim(type, value) / HasClaim(predicate):
возвращает значение true, если пользователь имеет RemoveClaim(claim): удаляет объект claim
claim определенного типа с определенным значением

• IsInRole(name): возвращает значение true, если


пользователь принадлежит роли с названием name

25
Создание/удаление cookies

Создание cookies Удаление cookies


Для создание применяется асинхронный метод контекста HttpContext.SignOutAsync(CookieAuthenticationDefaults.Auth
HttpContext.SignInAsync(). В качестве параметра метод enticationScheme) - передается название схемы
принимает схему аутентификации, которая была аутентификации, использованное в классе Startup.
использована при установки middleware
app.UseCookieAuthentication в классе Startup. В качестве
второго параметра передается объект ClaimsPrincipal,
который представляет пользователя.

После вызова метода расширения HttpContext.SignInAsync в


ответ клиенту будут отправляться аутентификационные куки,
которые при последующих запросах будут передаваться
обратно на сервер, десериализоваться и использоваться для
аутентификации пользователя.

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.
Токен в итоге хранится на клиенте и используется при необходимости авторизации како-го либо запроса.

• access token - используется для авторизации запросов и хранения дополнительной информации о


пользователе (аля user_id, user_role или еще что либо, эту информацию также называет payload)
• refresh token - выдается сервером по результам успешной аутентификации и используется для получения
нового access token'a и обновления refresh token'a
Каждый токен имеет свой срок жизни
Поскольку токены это не зашифрованная информация крайне не рекомендуется хранить в них такую
информацию как пароли.

33
JWT-токены(3)

HEADER PAYLOAD SIGNATURE


• typ – указывает тип токена. JWT Claims: Процесс сериализации JWT состоит из
Рекомендованное стандартом RFC кодирования заголовка, полезной
• iss – издатель токена;
7519 значение: JWT нагрузки и подписи, если она есть, с
• sub – описываемый объект; помощью алгоритма base64url.
• alg – определяет используемый
способ генерации цифровой подписи • aud – получатели; В блоке SIGNATURE находится подпись,
(SHA256 или RSA). которая удостоверяет подлинность
• exp – дата истечения срока действия;
блоков HEADER.PAYLOAD (включая
• iat – время создания. точку межу ними).
• ... Для ее создания используется метод
Полезные данные – часть токена, в указанный в параметре alg заголовка
которой размещается вся необходимая HEADER.
пользовательская информация.

34
JWT-токены(4)

Создание токена Чтение данных из токена


1. JSON объекты для блоков HEADER и PAYLOAD должны 1. Декодируем блок HEADER из Base64-строки в JSON
представлять собой UTF-8 строки. объект.

2. Каждый блок отдельно сначала представляется в виде 2. Получаем имя алгоритма генерации цифровой подписи
массива байт, а затем кодируется в строку с из параметра alg.
использованием Base64.
3. Декодируем блок SIGNATURE из Base64-строки в массив
3. Результат записывается через точку: HEADER.PAYLOAD байт (получаем цифровую подпись).

4. Используя алгоритм, указанный в параметре alg, 4. Проверяем корректность подписи для строки:
генерируется цифровая подпись для строки HEADER.PAYLOAD
HEADER.PAYLOAD
5. В случае успешной проверки декодируем блок PAYLOAD
5. Цифровая подпись кодируется в строку с из Base64-строки в JSON объект с утверждениями.
использованием Base64 и является блоком SIGNATURE.

6. SIGNATURE добавляется через точку к предыдущим


двум блокам: HEADER.PAYLOAD.SIGNATURE

35
Принцип аутентификации с JWT

Аутентификация с использованием Json Web Token (JWT) производится следующим образом:


1. Клиент использует свои данные (например имя пользователя и пароль) чтобы получить JWT.
2. Веб-приложение генерирует JWT c необходимыми утверждениями (claims). Токен, как правило, имеет
ограниченное время жизни (используется стандартное утверждение exp).
3. При обращении к веб-приложению клиент передает JWT в заголовке каждого запроса.
4. По истечению времени жизни JWT, клиент должен запросить новый токен.

36
Startup.cs appsettings.json

37
Ус та н о в к а ау те н т и ф и к а ц и и
• Для установки аутентификации с помощью токенов в методе ConfigureServices в вызов
services.AddAuthentication передается значение JwtBearerDefaults.AuthenticationScheme.
• Далее с помощью метода AddJwtBearer() добавляется конфигурация токена, где
применяется объект JwtBearerOptions, который позволяет с помощью свойств настроить
работу с токеном.
• RequireHttpsMetadata: если равно false, то SSL при отправке токена не используется.
Однако данный вариант установлен только для тестирования. В реальном приложении все
же лучше использовать передачу данных по протоколу https.
• TokenValidationParameters: параметры валидации токена - сложный объект,
определяющий, как токен будет валидироваться.
• Этот объект в свою очередь имеет множество свойств, которые позволяют настроить
различные аспекты валидации токена. Но наиболее важные свойства: IssuerSigningKey -
ключ безопасности, которым подписывается токен, и ValidateIssuerSigningKey - надо ли
валидировать ключ безопасности.

38
Создание токена

39
Создание токена

• Принцип создания ClaimsIdentity тот же, что и при аутентификации с помощью


cookies: создается набор объектов Claim, которые включают различные данные
о пользователе, например, логин, роль и т.д.
• Сам токен представляет объект JwtSecurityToken, для инициализации
которого применяются все те же константы и ключ безопасности, которые
определены которые использовались в классе Startup для настройки
JwtBearerAuthenticationMiddleware. Важно, чтобы эти значения совпадали.
• Далее посредством метода JwtSecurityTokenHandler().WriteToken(jwt)
создается Json-представление токена.

40
П р и м е р – A S P. N E T C O R E W E B A P I

1 Создание Базы данных. ViewModels

2 Создание к онтроллера для аутентифик ации

3 Тестирование работы ApiController

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

ASP.NET Identity представляет встроенную в ASP.NET систему аутентификации и


авторизации.
Данная система позволяет пользователям создавать учетные записи, аутентифицироваться,
управлять учетными записями или использовать для входа на сайт учетные записи внешних
провайдеров, таких как Facebook, Google, Microsoft, Twitter и других.

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

Cпециальный класс - UserManager<T> из пространства имен Microsoft.AspNetCore.Identity


• ChangePasswordAsync(user, old, new): изменяет пароль пользователя
• CreateAsync(user): создает нового пользователя
• DeleteAsync(user): удаляет пользователя
• FindByIdAsync(id): ищет пользователя по id
• FindByEmailAsync(email): ищет пользователя по email
• FindByNameAsync(name): ищет пользователя по нику
• UpdateAsync(user): обновляет пользователя
• Users: возвращает всех пользователей
• AddToRoleAsync(user, role): добавляет для пользователя user роль role
• GetRolesAsync (user): возвращает список ролей, к которым принадлежит пользователь user
• IsInRoleAsync(user, name): возвращает true, если пользователь user принадлежит роли name
• RemoveFromRoleAsync(user, name): удаляет роль name у пользователя user
47
Менеджер ролей RoleManager
Класс RoleManager<T> Методы для управления ролями:
• CreateAsync(role): создает новую роль
• DeleteAsync(role): удаляет роль
• FindByIdAsync(id): возвращает роль по id
• FindByNameAsync(name): возвращает роль по названию
• RoleExistsAsync(name): возвращает true, если роль с данным именем существует
• UpdateAsync(role): обновляет роль
• Roles: возвращает все роли

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)
Добавление документации

Project => Properties => Build

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
Спасибо за внимание
Вопросы?

Tänan tähelepanu eest!


Küsimused?