Поделиться через


Введение в ASP.NET Identity

Система членства в ASP.NET появилась с ASP.NET 2.0 еще в 2005 году, и с тех пор было много изменений в способах обработки проверки подлинности и авторизации веб-приложений. ASP.NET Identity — это свежий взгляд на то, что должна быть система членства при создании современных приложений для интернета, телефона или планшета.

Рекомендуется использовать самый безопасный вариант проверки подлинности. Сведения о приложениях .NET, развернутых в Azure, см. в статье:

Azure Key Vault и .NET Aspire обеспечивают наиболее безопасный способ хранения и получения секретов. Azure Key Vault — это облачная служба, которая защищает ключи шифрования и секреты, такие как сертификаты, строки подключения и пароли. Сведения о .NET Aspire см. в разделе Безопасное взаимодействие между размещением и интеграцией клиентов.

Избегайте предоставления учетных данных владельца ресурса, так как он:

  • Предоставляет клиенту пароль пользователя.
  • Значительный риск безопасности.
  • Следует использовать только в том случае, если другие потоки проверки подлинности недоступны.

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

Рекомендации по данным конфигурации:

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

Основная информация: членство в ASP.NET

членство в ASP.NET

Членство ASP.NET в было разработано для решения требований к членству на сайте, типичных в 2005 году, которые включали аутентификацию через формы, а также базу данных SQL Server для имен пользователей, паролей и данных профиля. Сегодня существует гораздо более широкий массив вариантов хранения данных для веб-приложений, и большинство разработчиков хотят разрешить своим сайтам использовать поставщики удостоверений социальных сетей для функций проверки подлинности и авторизации. Ограничения проектирования членства ASP.NET затрудняют этот переход:

  • Схема базы данных была разработана для SQL Server и ее нельзя изменить. Вы можете добавить сведения о профиле, но дополнительные данные упакованы в другую таблицу, что затрудняет доступ к любым средствам, за исключением API поставщика профилей.
  • Система поставщика позволяет изменить резервное хранилище данных, но система разработана вокруг предположений, подходящих для реляционной базы данных. Вы можете написать поставщику для хранения сведений о членстве в нереляционном механизме хранения, например в таблицах службы хранилища Azure, но затем необходимо обойти реляционную структуру, написав много кода и множество исключений System.NotImplementedException для методов, которые не применяются к базам данных NoSQL.
  • Так как функции входа и выхода основаны на проверке подлинности форм, система членства не может использовать OWIN. OWIN включает компоненты по промежуточного слоя для проверки подлинности, включая поддержку входа с помощью внешних поставщиков удостоверений (например, учетных записей Майкрософт, Facebook, Google, Twitter) и входа с использованием учетных записей организации из локальной среды Active Directory или Azure Active Directory. OWIN также включает поддержку OAuth 2.0, JWT и CORS.

ASP.NET простое членство

ASP.NET простое членство было разработано в качестве системы членства для ASP.NET веб-страницы. Она была выпущена вместе с WebMatrix и Visual Studio 2010 SP1. Цель простого членства заключается в том, чтобы упростить добавление функций членства в приложение веб-страниц.

Простое членство позволило упростить настройку сведений профиля пользователя, но по-прежнему предоставляет доступ к другим проблемам с ASP.NET членством и имеет некоторые ограничения:

  • Трудно сохранить данные системы членства в нереляционном хранилище.
  • Его нельзя использовать с OWIN.
  • Он не работает хорошо с существующими поставщиками членства ASP.NET, и это не расширяемо.

универсальные поставщики ASP.NET

Универсальные поставщики ASP.NET созданы для сохранения сведений о членстве в базе данных Microsoft Azure SQL, а также работают с SQL Server Compact. Универсальные поставщики были созданы на основе кода Entity Framework First, что означает, что универсальные поставщики могут использоваться для сохранения данных в любом хранилище, поддерживаемом EF. При использовании универсальных провайдеров структура базы данных была значительно очищена.

Универсальные поставщики основаны на инфраструктуре членства ASP.NET, поэтому они по-прежнему имеют те же ограничения, что и поставщик SqlMembership. То есть они были разработаны для реляционных баз данных, и трудно настроить сведения о профиле и пользователе. Эти поставщики также используют проверку подлинности форм для входа и выхода.

система идентификации ASP.NET

По мере того как история членства в ASP.NET развивалась на протяжении многих лет, команда ASP.NET многому научилась из отзывов клиентов.

Предположение, что пользователи будут входить, введя имя пользователя и пароль, которые они зарегистрировали в вашем приложении, больше не является действительным. Интернет стал более социальным. Пользователи взаимодействуют друг с другом в режиме реального времени через социальные каналы, такие как Facebook, Twitter и другие социальные веб-сайты. Разработчики хотят, чтобы пользователи могли входить через социальные сети, чтобы они могли получить полноценный опыт на своих веб-сайтах. Современная система членства должна включать входы на основе перенаправления в поставщики проверки подлинности, такие как Facebook, Twitter и другие.

По мере развития веб-разработки, развивались и модели веб-разработки. Модульное тестирование кода приложения стало основной проблемой для разработчиков приложений. В 2008 году ASP.NET добавлена новая платформа на основе шаблонаView-Controller модели (MVC), в частности, чтобы помочь разработчикам создавать модульные тестируемые приложения ASP.NET. Разработчики, которые хотели выполнить модульное тестирование логики приложения, также хотели бы сделать это с помощью системы членства.

Учитывая эти изменения в разработке веб-приложений, ASP.NET Identity было разработано со следующими целями:

  • система удостоверений one ASP.NET

    • ASP.NET Identity может использоваться со всеми платформами ASP.NET, такими как ASP.NET MVC, Web Forms, Web Pages, Web API и SignalR.
    • ASP.NET Identity можно использовать при создании веб-, телефонных, магазинных или гибридных приложений.
  • Простота подключения к данным профиля о пользователе

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

    • По умолчанию система удостоверений ASP.NET хранит все сведения о пользователе в базе данных. ASP.NET Identity использует Entity Framework Code First для реализации всего механизма сохраняемости.
    • Так как вы управляете схемой базы данных, распространенные задачи, такие как изменение имен таблиц или изменение типа данных первичных ключей, просто сделать.
    • Легко подключать различные механизмы хранения, такие как SharePoint, служба хранилища Azure, NoSQL базы данных и т. д., избегая System.NotImplementedExceptions исключений.
  • тестируемость модулей

    • ASP.NET Identity делает веб-приложение более модульно тестируемым. Модульные тесты можно написать для частей приложения, использующих ASP.NET Identity.
  • поставщик ролей

    • Существует поставщик ролей, который позволяет ограничить доступ к частям приложения по ролям. Вы можете легко создавать такие роли, как "Администратор" и добавлять пользователей в роли.
  • утверждения, основанные на

    • ASP.NET Identity поддерживает проверку подлинности на основе утверждений, где удостоверение пользователя представлено как набор утверждений. Утверждения позволяют разработчикам быть гораздо более экспрессивными в описании удостоверения личности пользователя, чем позволяют роли. В то время как членство в роли — это только логическое значение (член или не член), утверждение может включать в себя подробные сведения об удостоверении и членстве пользователя.
  • Поставщики социальных входов

    • Вы можете легко добавить в свое приложение авторизацию через социальные сети, такие как учетная запись Microsoft, Facebook, Twitter, Google и прочие, а также хранить данные, относящиеся к пользователю, в вашем приложении.
  • Интеграция OWIN

    • Аутентификация ASP.NET теперь основана на промежуточном программном обеспечении OWIN, которое можно использовать на любом OWIN-хосте. ASP.NET Identity не имеет никакой зависимости от System.Web. Это полностью совместимая платформа OWIN и может использоваться в любом размещенном приложении OWIN.
    • ASP.NET Identity использует аутентификацию OWIN для входа и выхода пользователей на веб-сайте. Это означает, что вместо использования FormsAuthentication для создания файла cookie приложение использует OWIN CookieAuthentication для этого.
  • пакет NuGet

    • ASP.NET Identity распространяется в виде пакета NuGet, установленного в шаблонах MVC, Web Forms и Web API, которые поставляются с Visual Studio 2017. Этот пакет NuGet можно скачать из коллекции NuGet.
    • Выпуск ASP.NET Identity в виде пакета NuGet упрощает для команды ASP.NET итерацию и внедрение новых функций и исправлений ошибок, обеспечивая их доставку разработчикам гибким образом.

Начало работы с ASP.NET Identity

ASP.NET Identity используется в шаблонах проектов Visual Studio 2017 для ASP.NET MVC, Web Forms, Web API и SPA. В этом пошаговом руководстве мы покажем, как шаблоны проектов используют ASP.NET Identity для добавления функций для регистрации, входа и выхода пользователя.

ASP.NET Identity реализуется с использованием следующей процедуры. Цель этой статьи — предоставить вам общий обзор ASP.NET Identity; вы можете следовать ей пошагово или просто прочитать подробности. Дополнительные инструкции по созданию приложений с помощью удостоверения ASP.NET, включая использование нового API для добавления пользователей, ролей и сведений профиля, см. в разделе "Дальнейшие действия" в конце этой статьи.

  1. Создайте приложение ASP.NET MVC с отдельными учетными записями. Вы можете использовать ASP.NET Identity в ASP.NET MVC, веб-формы, веб-API, SignalR и т. д. В этой статье мы начнем с приложения ASP.NET MVC.

    изображение нового окна проекта asp dot Net

  2. Созданный проект содержит следующие три пакета для ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Этот пакет содержит реализацию ASP.NET Identity на базе Entity Framework, которая сохраняет данные и схемы ASP.NET Identity в SQL Server.
    • Microsoft.AspNet.Identity.Core
      Этот пакет содержит основные интерфейсы для ASP.NET Identity. Этот пакет можно использовать для записи реализации для ASP.NET Identity, предназначенных для различных хранилищ сохраняемости, таких как хранилище таблиц Azure, базы данных NoSQL и т. д.
    • Microsoft.AspNet.Identity.OWIN
      Этот пакет содержит функциональные возможности, которые используются для подключения проверки подлинности OWIN с помощью удостоверения ASP.NET в приложениях ASP.NET. Это используется при добавлении функций входа в приложение и вызове ПО промежуточного слоя проверки подлинности файлов cookie OWIN для создания файла cookie.
  3. Создание пользователя.
    Запустите приложение и нажмите на ссылку Регистрация, чтобы создать пользователя. На следующем рисунке показана страница регистрации, которая собирает имя пользователя и пароль.

    изображение создания новой учетной записи

    Когда пользователь выбирает кнопку Зарегистрировать, действие Register контроллера учетной записи создает пользователя, вызывая API идентификации ASP.NET, как показано ниже:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Войти.
    Если пользователь успешно создан, она войдет в систему с помощью метода SignInAsync.

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    Метод SignInManager.SignInAsync генерирует удостоверение личности ClaimsIdentity. Так как ASP.NET Identity и OWIN Cookie Authentication — это системы на основе утверждений, фреймворк требует, чтобы приложение создавало ClaimsIdentity для пользователя. ClaimsIdentity содержит сведения обо всех утверждениях для пользователя, например о том, к каким ролям принадлежит пользователь.

  5. Выйдите из системы.
    Выберите ссылку выхода из системы, чтобы вызвать действие "Выход из системы" в контроллере учетной записи.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    Выделенный выше код показывает метод OWIN AuthenticationManager.SignOut. Это аналогично методу FormsAuthentication.SignOut, используемому модулем FormsAuthentication в Web Forms.

Компоненты ASP.NET Identity

На диаграмме ниже показаны компоненты системы ASP.NET Identity (выберите на этот или на диаграмме, чтобы увеличить ее). Пакеты в зеленом цвете составляют систему ASP.NET Identity. Все остальные пакеты — это зависимости, необходимые для использования системы удостоверений ASP.NET в приложениях ASP.NET.

схема , показывающая компоненты системы удостоверений ASP.NET

Ниже приведено краткое описание пакетов NuGet, которые ранее не упоминались:

  • Microsoft.Owin.Security.Cookies
    Промежуточное программное обеспечение, позволяющее приложению использовать аутентификацию на основе файлов cookie, аналогичную аутентификации форм в ASP.NET.
  • EntityFramework
    Entity Framework — это рекомендуемая технология доступа к данным корпорации Майкрософт для реляционных баз данных.

Переход с системы Membership на ASP.NET Identity

Мы надеемся в ближайшее время предоставить рекомендации по переносу существующих приложений, использующих ASP.NET Membership или Simple Membership, на новую систему ASP.NET Identity.

Дальнейшие действия