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

Source: https://docs.sisk-framework.org/ru/docs/extensions/basic-auth.html

Пакет Базовой Аутентификации добавляет обработчик запросов, способный обрабатывать базовую схему аутентификации в вашем приложении Sisk с минимальной конфигурацией и усилиями.
Базовая аутентификация HTTP - это минимальная форма аутентификации запросов по идентификатору пользователя и паролю, где сессия контролируется исключительно клиентом, и нет токенов аутентификации или доступа.

![Базовая Аутентификация](https://docs.sisk-framework.org/assets/img/basic-auth.svg)

Подробнее о схеме базовой аутентификации можно прочитать в [спецификации MDN](https://developer.mozilla.org/pt-BR/docs/ru/Web/HTTP/Authentication).

## Установка

Чтобы начать, установите пакет Sisk.BasicAuth в вашем проекте:

    > dotnet add package Sisk.BasicAuth

Вы можете ознакомиться с другими способами установки в вашем проекте в [репозитории Nuget](https://www.nuget.org/packages/Sisk.BasicAuth/0.15.0).

## Создание обработчика аутентификации

Вы можете контролировать схему аутентификации для всего модуля или для отдельных маршрутов. Для этого давайте сначала напишем наш первый базовый обработчик аутентификации.

В примере ниже устанавливается соединение с базой данных, проверяется, существует ли пользователь и действителен ли пароль, и после этого пользователь сохраняется в контексте.

```cs
public class UserAuthHandler : BasicAuthenticateRequestHandler
{
    public UserAuthHandler() : base()
    {
        Realm = "Чтобы войти на эту страницу, пожалуйста, введите ваши учетные данные.";
    }

    public override HttpResponse? OnValidating(BasicAuthenticationCredentials credentials, HttpContext context)
    {
        DbContext db = new DbContext();

        // в данном случае мы используем электронную почту в качестве поля идентификатора пользователя, поэтому мы
        // ищем пользователя по его электронной почте.
        User? user = db.Users.FirstOrDefault(u => u.Email == credentials.UserId);
        if (user == null)
        {
            return base.CreateUnauthorizedResponse("Извините! Пользователь с таким электронным адресом не найден.");
        }

        // проверяет, что пароль учетных данных действителен для этого пользователя.
        if (!user.ValidatePassword(credentials.Password))
        {
            return base.CreateUnauthorizedResponse("Недействительные учетные данные.");
        }

        // добавляет вошедшего пользователя в контекст HTTP
        // и продолжает выполнение
        context.Bag.Add("loggedUser", user);
        return null;
    }
}
```

Итак, просто ассоциируйте этот обработчик запросов с нашим маршрутом или классом.

```cs
public class UsersController
{
    [RouteGet("/")]
    [RequestHandler(typeof(UserAuthHandler))]
    public string Index(HttpRequest request)
    {
        User loggedUser = request.Bag.Get<User>();
        return $"Привет, {loggedUser.Name}!";
    }
}
```

Или используя класс [RouterModule](https://docs.sisk-framework.org/api/Sisk.Core.Routing.RouterModule.md):

```cs
public class UsersController : RouterModule
{
    public ClientModule()
    {
        // все маршруты внутри этого класса будут обрабатываться
        // UserAuthHandler.
        base.HasRequestHandler(new UserAuthHandler());
    }
    
    [RouteGet("/")]
    public string Index(HttpRequest request)
    {
        User loggedUser = request.Bag.Get<User>();
        return $"Привет, {loggedUser.Name}!";
    }
}
```

## Примечания

Основная ответственность базовой аутентификации лежит на клиентской стороне. Хранение, контроль кэша и шифрование обрабатываются локально на клиенте. Сервер только получает учетные данные и проверяет, разрешен ли доступ или нет.

Обратите внимание, что этот метод не является одним из самых безопасных, поскольку он возлагает значительную ответственность на клиента, которую может быть трудно отслеживать и поддерживать безопасность его учетных данных. Кроме того, важно передавать пароли в защищенном контексте соединения (SSL), поскольку они не имеют встроенного шифрования. Короткий перехват в заголовках запроса может раскрыть учетные данные доступа вашего пользователя.

Выбирайте более надежные решения аутентификации для приложений в производстве и избегайте использования слишком многих готовых компонентов, поскольку они могут не адаптироваться к потребностям вашего проекта и в конечном итоге подвергать его риску безопасности.
