Базовая Аутентификация
Эта страница переведена с английского автоматически. Читать оригинал
Пакет Базовой Аутентификации добавляет обработчик запросов, способный обрабатывать базовую схему аутентификации в вашем приложении Sisk с минимальной конфигурацией и усилиями. Базовая аутентификация HTTP - это минимальная форма аутентификации запросов по идентификатору пользователя и паролю, где сессия контролируется исключительно клиентом, и нет токенов аутентификации или доступа.
Подробнее о схеме базовой аутентификации можно прочитать в спецификации MDN.
Установка #
Чтобы начать, установите пакет Sisk.BasicAuth в вашем проекте:
> dotnet add package Sisk.BasicAuth
Вы можете ознакомиться с другими способами установки в вашем проекте в репозитории Nuget.
Создание обработчика аутентификации #
Вы можете контролировать схему аутентификации для всего модуля или для отдельных маршрутов. Для этого давайте сначала напишем наш первый базовый обработчик аутентификации.
В примере ниже устанавливается соединение с базой данных, проверяется, существует ли пользователь и действителен ли пароль, и после этого пользователь сохраняется в контексте.
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;
}
}Итак, просто ассоциируйте этот обработчик запросов с нашим маршрутом или классом.
public class UsersController
{
[RouteGet("/")]
[RequestHandler(typeof(UserAuthHandler))]
public string Index(HttpRequest request)
{
User loggedUser = request.Bag.Get<User>();
return $"Привет, {loggedUser.Name}!";
}
}Или используя класс RouterModule:
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), поскольку они не имеют встроенного шифрования. Короткий перехват в заголовках запроса может раскрыть учетные данные доступа вашего пользователя.
Выбирайте более надежные решения аутентификации для приложений в производстве и избегайте использования слишком многих готовых компонентов, поскольку они могут не адаптироваться к потребностям вашего проекта и в конечном итоге подвергать его риску безопасности.