Sisk

Базовая аутентификация (устарела)

Эта страница переведена с английского автоматически. Читать оригинал

Осторожно

Discontinued, do not use. The Sisk.BasicAuth package is no longer maintained and is deprecated on NuGet, with no replacement package. Its BasicAuthenticateRequestHandler does not decode the Base64 credentials sent by standard HTTP clients, so authenticated requests are rejected. Implement Basic authentication with your own request handler that reads HttpHeaderCollection.Authorization instead. This page is kept for historical reference only.

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

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

Подробнее о схеме базовой аутентификации читайте в спецификации MDN.

Installing #

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

> dotnet add package Sisk.BasicAuth

Больше способов установки вы можете посмотреть в репозитории NuGet.

Creating your auth handler #

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

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

C#
public class UserAuthHandler : BasicAuthenticateRequestHandler
{
    public UserAuthHandler() : base()
    {
        Realm = "To enter this page, please, inform your credentials.";
    }

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

        // в данном случае мы используем email в качестве поля идентификатора пользователя, поэтому
        // будем искать пользователя по его email.
        User? user = db.Users.FirstOrDefault(u => u.Email == credentials.UserId);
        if (user == null)
        {
            return base.CreateUnauthorizedResponse("Sorry! No user was found by this email.");
        }

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

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

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

C#
public class UsersController
{
    [RouteGet("/")]
    [RequestHandler(typeof(UserAuthHandler))]
    public string Index(HttpRequest request)
    {
        User loggedUser = request.Bag.Get<User>();
        return $"Hello, {loggedUser.Name}!";
    }
}

Или используя класс RouterModule:

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

Remarks #

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

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

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

Sisk распространяется с открытым исходным кодом по лицензии MIT.

Начните вводить, чтобы искать по документации и справочнику API.