Понимание основной идентичности Mvc

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

На данный момент я понимаю, что когда пользователь передает свои учетные данные, библиотека идентификации выдает токен, и этот токен будет записан в файлы cookie браузера. Теперь все последующие запросы будут идентифицировать пользователя на основе этого файла cookie браузера. Однако я не могу найти объяснений этому. Почему это безопасно, почему я не могу украсть этот файл cookie и использовать его как свой собственный? Я знаю, что это еще не все, и, возможно, я неправильно понял вышеупомянутую часть.

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


person Bagzli    schedule 01.11.2018    source источник
comment
Вы уже читали официальную документацию?   -  person Nkosi    schedule 02.11.2018
comment
У меня есть, но все, что я могу найти, - это примеры того, как реализовать это в вашем проекте. Я не об этом спрашиваю.   -  person Bagzli    schedule 02.11.2018
comment
Я не возражаю против голосования, но по крайней мере объясните, почему вы это делаете. Не думаю, что я сделал здесь что-то против правил. Сначала я провел свое исследование и ничего не смог придумать, поэтому прошу здесь о помощи.   -  person Bagzli    schedule 02.11.2018
comment
Под идентичностью лучше всего понимается поставщик / магазин аутентификации. В основном это касается управления пользователями: создание, обновление, назначение ролей и других утверждений, паролей, двухфакторности и т. Д. То, о чем вы на самом деле говорите, это подсистема аутентификации и авторизации ASP.NET Core, в частности cookie auth. Identity просто поддерживает это, но вы можете так же легко отключить Identity с помощью чего-то вроде IdentityServer, Auth0 или даже полностью настраиваемой системы.   -  person Chris Pratt    schedule 02.11.2018


Ответы (1)


как именно тождество работает с ядром mvc.

Как говорит @ Крис Пратт, вы говорите о подсистеме безопасности. Поскольку вы говорите о cookie, я возьму в качестве примера схему аутентификации cookie.

Встроенная безопасность в основном присутствует в 4 проектах:

  • HttpAbstractions: основные интерфейсы и классы, такие как схема аутентификации, обработчик аутентификации, билет аутентификации и т. д.
  • Безопасность: промежуточное ПО для аутентификации, аутентификация файлов cookie, аутентификация на предъявителя JWT, аутентификация OAuth2.0 (Google / Facebook / Microsoft /...) и так далее.
  • Identity: проект под названием «Identity», который помогает управлять пользователями / ролями / утверждениями / и т. д.
  • DataProtection: API защиты данных для защиты и снятия защиты данных. Вы можете рассматривать его как API для шифрования и дешифрования.

Отправной точкой для понимания того, как работает аутентификация, является AuthenticationMiddleware. Это промежуточное ПО будет пытаться аутентифицировать каждый запрос, если это возможно:

    public async Task Invoke(HttpContext context)
    {
        // ...

        // Give any IAuthenticationRequestHandler schemes a chance to handle the request
        var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
        foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
        {
            var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
            if (handler != null && await handler.HandleRequestAsync())
            {
                return;
            }
        }

        // Use the default scheme to authenticate request
        var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
        if (defaultAuthenticate != null)
        {
            var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
            if (result?.Principal != null)
            {
                context.User = result.Principal;
            }
        }

        await _next(context);
    }

Обычно это промежуточное ПО запускается перед другим промежуточным ПО / mvc, поэтому вы можете перехватывать запросы по мере необходимости.

Если вы хотите получить доступ к url, защищенному [Authorize], без входа в систему, вам будет предложено войти в систему с помощью какой-либо схемы. Вы можете настроить свои службы для использования различных схем по своему усмотрению, таких как Jwt Bearer, файлы cookie и т. Д.

Если вы используете схему файлов cookie, CookieAuthenticationHandler сделает тяжелую работу:

  • Войти: выдаст новый файл cookie, если вы считаете, что проверили принципала пользователя.
  • Аутентификация: проверить файл cookie, отправленный клиентом
  • Выйти: удалить куки

Обратите внимание, что все это выполняется Microsoft.AspNetCore.Authentication.Cookies/CookieAuthenticationHandler, то есть обработчиком, определенным в aspnet/Security, а не в aspnet/Identity библиотеке.

почему я не могу украсть этот файл cookie и использовать его как свой собственный?

  1. Конечно, вы можете украсть чей-то cookie и использовать его как свой собственный. Фактически, если куки Алисы украдены Бобом (скажем, через XSS или sniffering), Боб будет рассматриваться как Алиса. ASP.NET Core (и другие технологии, такие как PHP / Python / Java) не могут предотвратить это, и для предотвращения кражи нужно многое сделать:

    • The website should use HTTPS rather than HTTP
    • кодировать такие символы, как _12 _, _ 13 _, _ 14_ и т. д., чтобы предотвратить XSS
    • ...
  2. Кроме того, иногда вам не нужно воровать чей-то cookie. К CSRF вы просто «одолжите» его cookie.

Почему это безопасно

Как правило, даже если теоретически возможно украсть чей-то cookie или одолжить чей-то cookie, это произойдет только в том случае, если вы неправильно разрабатываете свое приложение или развертываете их небезопасным способом.

Другое дело, что вы вряд ли сможете подделать cookie на стороне клиента.

person itminus    schedule 05.11.2018
comment
+1 за ссылку на куки. Можете ли вы здесь ответить на мой вопрос: stackoverflow .com / questions / 53179214 /? - person w0051977; 07.11.2018