Aspnet пользователь что это

Аутентификация в приложениях ASP.NET

Aspnet пользователь что это

      Большинство web-сайтов работают в режиме анонимного доступа. Они содержат информацию, которую могут просматривать все желающие, и поэтому не проводят аутентификацию пользователей.

Web-приложения ASP.NET предоставляют анонимный доступ к серверным ресурсам посредством назначения учетной записи анонимному пользователю.

По умолчанию учетная запись для анонимного доступа имеет имя в виде IUSER _ имя компьютера.

      ASP.NET исполняет web-приложения под учетной записью ASPNET. Это означает, что при выполнении задачи, не предусмотренной привилегиями пользователя (например, запись файла на диск), приложение получает отказ в доступе.       Идентификация пользователей применяется в тех случаях, когда нужно предоставить доступ к разделам web -приложения только для определенных пользователей. Это может быть Internet -магазины, форумы, закрытые разделы в корпоративных Intranet -сайтах и так далее.

      Безопасность в приложениях ASP.NET основана на трех операциях:

  • Аутентификация – процесс идентификации пользователя для предоставления доступа к какому-то ресурсу приложения (разделу сайта, странице, базе данных, …). Аутентификация основана на проверке сведений о пользователе (например, имени и пароля);
  • Авторизация – процесс предоставления доступа пользователю на основе данных аутентификации;
  • Олицитворение (impersonalisation) – предоставление серверному процессу ASP.NET прав доступа клиента.

      Существует три способа аутентификации пользователей в приложениях ASP.NET:

  • аутентификация Windows — применяется для идентификации и авторизации пользователей в зависимости от привилегий учетной записи пользователя. Работает аналогично обычным механизмам сетевой безопасности Windows и выполняется контроллером домена;
  • аутентификация Forms — пользователь вводит логин и пароль в Web -форме, после чего авторизация происходит по списку пользователей, хранящемуся, например, в базе данных. Применяется на большинстве Internet-сайтов при регистрации в Inernet -магазинах, форумах, пр;
  • аутентификация Passport — все пользователи имеют единое имя и пароль, используемые для сайтов, использующих данный тип авторизации. Пользователи регистрируются в службе Microsoft Passport.

      Важно отметить, что аутентификация ASP.NET применяются только для web -форм (.aspx -файлы), контролов (.ascx -файды) и прочих ресурсов ASP.NET. HTML-файлы не входят в этот список. Для авторизации доступа к HTML -файлам нужно их зарегистрировать вручную!
      Тип аутентификации указывается в конфигурационном файле Web.config :

      По умолчанию применяется тип аутентификации Windows. Значение None имеет смысл устанавливать если используется собственная схема аутентификации или анонимный доступ (для повышения производительности).
Аутентификация Windows. Существует 4 типа аутентификации Windows : обычная ( basic ), краткая ( digest ), встроенная ( integated ) и на основе клиентских сертификатов SSL. Обычную и краткую аутентификацию применяют для идентификации имени пользователя и пароля, указываемом в диалоговом окне. Они хорошо работают в Internet , так как данные передаются по HTTP. Базовая аутентификация передает пароль и имя пользователя в кодировке Base 64, которую легко раскодировать. Для повышения безопасности можно использовать базовую аутентификацию совместно с SSL. Базовую аутентификация поддерживают большинство браузеров.       Краткая аутентификация является более безопасной, так как пароль шифруется по алгоритму MD 5. Она поддерживается браузерами Internet Explorer 5.0 и выше, либо на клиентской машине должен быть установлен. NET Framework. Кроме этого, учетные записи пользователей должны храниться в Active Directory.       Встроенная аутентификация применяется для идентификации учетных записей Windows и не может применяться в Internet , так как клиент и сервер должны пройти проверку контроллером домена. При этом пароли по сети не передаются, что увеличивает безопасность приложения. Этот тип аутентификации блокируется файрволами и работает только с Internet Explorer. Встроенная аутентификации немного медленнее, чем базовая или краткая.       Применение сертификатов SSL так же обычно применяется в Intranet , т.к. требует раздачи цифровых сертификатов. При этом типе аутентификации пользователям не нужно регистрироваться. Сертификаты можно сопоставить учетным записям пользователей в домене или Active Directory.       Для указания способа аутентификации нужно выполнить следующие действия: 1. Запустить диспетчер IIS 2. Щелкнуть правой кнопкой мыши по приложению и выбрать в контекстном меню Свойства.

3. В появившимся диалоге перейти на вкладку Безопасность каталога и нажать кнопку  Изменить в разделе Анонимный доступ и проверка подлинности.

4. В диалоге Методы проверки подлинности указать тип аутентификации. 5. Указать права доступа к папке или отдельным файлам в папке Web -приложения. Обязательно нужно разрешить доступ для пользователя ASPNET.       Для поддержки URL-авторизации при Windows-аутентификации для защиты содержимого папок применяются Web.config файлы, находящиеся в этих папках. Структура файла такова (cимвол «*» означает всех пользователей):    В данном случае разрешен доступ для пользователя DENIS и запрещен доступ для всех остальных. Вместо имени пользователя может быть и название роли, к которой принадлежат пользователи – администраторы, менеджеры, …:       Если мы хотим защитить он неаутентифицированных пользователей папку полностью (например, папку, содержащую формы для администрирования сайта), то нужно разместить в ней файл Web.config с таким содержанием (cимвол «?» означает анонимных неавторизированных пользователей):      Если же мы хотим защитить только один файл (например, для подтверждения заказа в Internet -магазине), то в Web.config из корневой папки нужно добавить такие строки:
     Приложение извлекает данные пользователей с помощью свойства Identity класса User. Это свойство возвращает объект, содержащий имя пользователя и роль.

Читайте также  OS optimized defaults lenovo что это

bool authenticated = User.Identity.IsAuthenticated ; string name = User.Identity.Name;

bool admin = User.IsInRole(«Admins»);

Forms-аутентификация

При использовании Forms-аутентификации запрос параметров регистрации (например, логина и пароля) происходит в web-форме. Регистрационная страница указывается в файле Web.config. При первом обращении к защищаемым страницам ASP.

NET перенаправляет пользователя на страницу для ввода пароля. При успешной регистрации аутентификационные данные сохраняются в виде cookie и при повторном обращении к защищенным страницам регистрация не требуется.       Для того, чтобы использовать Forms-аутентификацию в файле Web.

config в корневой папке приложения нужно указать страницу для ввода пароля:

      При попытке просмотра защищенной страницы ASP.NET проверяет, есть ли аутентификационных cookie в запросе. Если cookie нет, то запрос перенаправляется на страницу для регистрации, если есть — ASP.

NET дешифрует cookie и извлекает из него регистрационную информацию.

      На форме находятся поля для ввода логина и пароля и флажок для сохраняемой регистрации. При нажатии кнопки «Войти» происходит поиск пользователя с таким логином и паролем. Если такой пользователь найден, вызывается функция FormsAuthentication.RedirectFromLoginPage (), в которой указывается идентификатор пользователя и флаг для сохраняемой регистрации. Если же нет – выводится сообщение об ошибке.

protected void btnLogin_Click(object sender, System.EventArgs e) {    if (!IsValid) // проверяем правильность введенных данных       return;    OleDbConnection connection = GetDbConnection();    try    {       connection.Open();       OleDbCommand command = new OleDbCommand(string.

Format(«SELECT id FROM Customers WHERE login='{0}' AND password='{1}'», login, password), connection);       OleDbDataReader reader = command.ExecuteReader();       if (!reader.Read()) // пароль или логин неверны       {          lblError.

Text = «Неверный пароль – попробуйте еще раз»;          return ;       }       string id = return reader.GetInt32(0).ToString();       FormsAuthentication.RedirectFromLoginPage(id, chkbRememberLogin.Checked);    }    catch (OleDbException ex)    {       lblError.

Text = «Ошибка базы данных»;    }    finally    {        connection.Close();    }

}

Аутентификации на основе ролей

Для аутентификации на основе ролей применяется атрибут roles тега allow. Например, если мы хотим запретить доступ всем, кроме пользователей из группы Admin , мы должны вставить такие строки в файл Web.config.

      Затем при каждом запросе нужно связывать учетные записи пользователей и роли. Обычно это делается в обработчике события AuthenticateRequest в файле Global.asax.

protected void Application_AuthenticateRequest(Object sender, EventArgs e) {    HttpApplication appl = (HttpApplication)sender;    if (appl.Request.IsAuthenticated && appl.User.Identity is FormsIdentity)    {       FormsIdentity identity = (FormsIdentity)appl.User.

Identity;       DataTable tblUsers = (DataTable)Application[«UsersTable»];       appl.Context.User = new GenericPrincipal(identity,       new string[] {(string)(tblUsers.Rows.Find(identity.Name)[«Role»]) } );    }

}

      В коде проверяется тип аутентификации пользователя и то, что он уже зарегистрирован. Имя пользователя извлекается из cookie свойством Name. Таблица с именами пользователей и их ролями для повышения быстродействия была сохранена в объекте Application. Из этой таблицы и находим роль пользователя, которую сохраняем в объекте GenericPrincipal.

Параметры аутентификации

Если второй параметр функции RedirectFromLoginPage () равен false , то время жизни сеансового cookie , генерируемого ASP.NET , равно по умолчанию 30 минутам. Для изменения этого интервала служит параметр timeout тега forms в файле Web.config.

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

Время же жизни сохраняемых cookie равно 50 годам.       Можно указать имя аутентификационных cookie , поместив его в атрибут name (имя по умолчанию — ASPXAUTH ):       По умолчанию аутентификацонные cookie шифруются и проверяются.

Уровень защиты можно указать через атрибут protection , значение по умолчанию которого All. Значение Validation предписывает только проверку cookie , а значение Encript – только шифрование. Полностью отключить защиту можно указав значение None.

Отключать защиту имеет смысл если данные передаются по протоколу HTTPS.

Сброс forms-аутентификации

   Сброс регистрации можно увидеть на многих сайтах. Для сброса аутентификации применяется метод FormsAuthentication.SignOut (). Он устанавливает дату окончания действия cookie на прошедшее время и cookie автоматически уничтожается.

Аутентификация Passport

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

      Для использования Passport аутентификации в web -приложении нужно установить Passport SDK. Passport SDK предоставляется бесплатно для тестирования, но для коммерческого использования на сайте необходимо приобретать лицензию.

      При обращении к приложению с Passport аутентификацией проверяется наличие cookie с данные Passport. Если такого файла нет, пользователь перенаправляется на страницу для регистрации Passport.       Для включения данного режима аутентификации в файле Web.

config нужно указать следующее:       Для обязательной регистрации всех посетителей сайта в разделе autorization нужно запретить доступ неавторизированным пользователем:
      Получить доступ к сведениям о пользователе можно с помощью события PassportAuthentication _ OnAuthenticate в файле Global.asax :

protected void PassportAuthentication_OnAuthenticate(Object sender,         PassportAuthenticationEventArgs e){    System.Web.Security.PassportIdentity id = e.Identity;     if(id.IsAuthenticated)    {        Session[«PassportID»] = e.Identity.Name;        Session[«Name»] = e.Identity[«FirstName»] + e.Identity[«LastName»:];        Session[«Email»] = e.Identity[«PrefferedEmail»];     }

}

Кондратьев Денис

Источник: http://www.realcoding.net/article/view/1855

Свойства пользователей в ASP.NET Identity

83

ASP.NET — ASP.NET Identity — Свойства пользователей

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

На рисунке ниже показан список созданных ролей и список пользователей, входящих в каждую роль. Обратите внимание, что пользователь «Елена» входит сразу в две роли — Users и Employees:

Читайте также  Keyguardtestactivity что за процесс

Добавление свойств пользователя

Когда ранее мы создали класс AppUser я отметил, что базовый класс IdentityUser содержит несколько свойств для описания пользователя, таких как адрес электронной почты и имя.

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

NET Membership эта возможность реализована через профили пользователей, но ASP.NET Identity использует другой подход.

Т.к. ASP.NET Identity использует Entity Framework для работы с данными пользователя, все что нам нужно — это добавить необходимые свойства в класс пользователя. Code-First воссоздаст схему базы данных на основе класса пользователя, добавив новые столбцы в таблицу Users.

В следующем примере мы добавили свойство, описывающее город, в котором проживает пользователь:

using System; using Microsoft.AspNet.Identity.EntityFramework; using System.ComponentModel.DataAnnotations; namespace Users.Models { public enum Cities { [Display(Name = «Лондон»)] LONDON, [Display(Name = «Париж»)] PARIS, [Display(Name = «Москва»)] MOSCOW } public class AppUser : IdentityUser { public Cities City { get; set; } } }

В этом примере мы определили перечисление Cities и добавили свойство City в класс модели пользователя AppUser. Чтобы пользователи могли просматривать и редактировать свое местоположение, давайте добавим несколько методов действий в контроллер Home:

using System; using System.Collections.Generic; using System.Threading.Tasks; using System.Web.Mvc; using Users.Infrastructure; using Users.Models; using System.Linq; using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity; using System.Reflection; using System.ComponentModel.DataAnnotations; using System.Web; namespace Users.Controllers { public class HomeController : Controller { // … [Authorize] public ActionResult UserProps() { return View(CurrentUser); } [Authorize] [HttpPost] public async Task UserProps(Cities city) { AppUser user = CurrentUser; user.City = city; await UserManager.UpdateAsync(user); return View(user); } private AppUser CurrentUser { get { return UserManager.FindByName(HttpContext.User.Identity.Name); } } private AppUserManager UserManager { get { return HttpContext.GetOwinContext().GetUserManager(); } } // Вспомогательный метод, загружающий название элемента перечисления // из атрибута Display [NonAction] public static string GetCityName(TEnum item) where TEnum : struct, IConvertible { if (!typeof(TEnum).IsEnum) { throw new ArgumentException(«Тип TEnum должен быть перечислением»); } else return item.GetType() .GetMember(item.ToString()) .First() .GetCustomAttribute() .Name; } } }

Мы добавили свойство CurrentUser, которое возвращает экземпляр класса текущего пользователя AppUser, используя класс управления AppUserManager.

Мы передаем объект AppUser в представление в GET-версии метода UserProps.

POST-версия этого метода используется для изменения данных о местоположении пользователя.

Ниже показан код представления UserProps.cshtml, которое отображает текущее местоположение пользователя и позволяет его редактировать, используя выпадающий список со стандартными значениями:

@using Users.Controllers @using System.Linq @using Users.Models @model AppUser @{ ViewBag.Title = «Пользовательские свойства»; } Пользовательские свойства

Текущий город

@HomeController.GetCityName(Model.City)

@using (Html.BeginForm()) { Город: @Html.DropDownListFor(x => x.City, new SelectList( Enum.GetValues(typeof(Cities)) .OfType() .Select(c => { return new { Id = c, Text = HomeController.GetCityName(c) }; }), «Id», «Text» )) Сохранить }

Внимание, не запускайте приложение в данный момент! Т.к.

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

Подготовка к миграции базы данных

Как было сказано выше, стандартным поведением Entity Framework является воссоздание базы данных при любых изменениях в классах модели, влияющих на схему базы данных.

Удаление данных во время процесса разработки обычно не является проблемой, но в производственной среде такое поведение является катастрофическим.

В этом разделе я покажу как использовать миграцию данных Entity Framework, которая обновляет схему данных Code First без их удаления.

Во-первых, нам необходимо выполнить следующую команду в панели Package Manager Console среды Visual Studio:

Enable-Migrations –EnableAutomaticMigrations

Эта команда добавит поддержку миграций базы данных и создаст папку Migrations в проекте, содержащую файл Configuration.cs со следующим содержимым:

namespace Users.Migrations { using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = «Users.Infrastructure.AppIdentityDbContext»; } protected override void Seed(Users.Infrastructure.AppIdentityDbContext context) { // This method will be called after migrating to the latest version. // You can use the DbSet.AddOrUpdate() helper extension method // to avoid creating duplicate seed data. E.g. // // context.People.AddOrUpdate( // p => p.FullName, // new Person { FullName = «Andrew Peters» }, // new Person { FullName = «Brice Lambson» }, // new Person { FullName = «Rowan Miller» } // ); // } } }

Этот класс будет использоваться для переноса существующих данных в базе данных в новую схему. Метод Seed() используется для обновления существующих записей базы данных. В примере ниже показано использование этого метода для установки значений по умолчанию, в том числе и для нового свойства City:

namespace Users.Migrations { using Microsoft.AspNet.Identity.EntityFramework; using System; using System.Data.Entity; using System.Data.Entity.Migrations; using System.Linq; using Users.Infrastructure; using Users.Models; using System.Data.Entity.Migrations; using Microsoft.AspNet.Identity; internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; ContextKey = «Users.Infrastructure.AppIdentityDbContext»; } protected override void Seed(Users.Infrastructure.AppIdentityDbContext context) { AppUserManager userMgr = new AppUserManager(new UserStore(context)); AppRoleManager roleMgr = new AppRoleManager(new RoleStore(context)); string roleName = «Administrators»; string userName = «Admin»; string password = «mypassword»; string email = «admin@professorweb.ru»; if (!roleMgr.RoleExists(roleName)) { roleMgr.Create(new AppRole(roleName)); } AppUser user = userMgr.FindByName(userName); if (user == null) { userMgr.Create(new AppUser { UserName = userName, Email = email }, password); user = userMgr.FindByName(userName); } if (!userMgr.IsInRole(user.Id, roleName)) { userMgr.AddToRole(user.Id, roleName); } foreach (AppUser dbUser in userMgr.Users) { dbUser.City = Cities.MOSCOW; } context.SaveChanges(); } } }

Обратите внимание, что большая часть кода в этом примере скопирована из класса IdentityDbInit, который мы определили ранее для заполнения базы данных значениями по умолчанию (создание роли администратора и админа). Чуть позже мы обновим этот класс (с добавлением миграций нам не нужен будет этот функционал). Помимо создания администратора, мы инициализировали свойство City значением по умолчанию:

Читайте также  Чем открыть Backup андроид на ПК
// … foreach (AppUser dbUser in userMgr.Users) { dbUser.City = Cities.MOSCOW; } // …

Вы не обязаны устанавливать значения по умолчанию для всех новых свойств — я просто хотел показать, как можно обновить все существующие данные пользователей, используя метод Seed() класса Configuration. Будьте осторожны при установке таких значений в реальных приложениях, т. к. это приведет к обновлению всех данных пользователей при последующих изменениях класса модели.

Изменение класса контекста базы данных

Как я сказал выше, нам необходимо изменить класс инициализации базы данных IdentityDbInit.

Сейчас он унаследован от класса DropCreateDatabaseIfModelChanges, который, как вы уже догадались по названию, удаляет и воссоздает базу данных при изменении схемы классов модели Entity Framework. В примере ниже мы изменили базовый класс для IdentityDbInit, чтобы он не влиял на базу данных:

// … namespace Users.Infrastructure { public class AppIdentityDbContext : IdentityDbContext { // … } public class IdentityDbInit : NullDatabaseInitializer { } }

Мы удалили все методы, определенные ранее, а также изменили базовый класс на NullDatabaseInitializer, который игнорирует любые изменения в классах модели данных.

Выполнение миграции

Все что нам остается сделать — это применить миграции. Во-первых выполните следующую команду в панели Package Manager Console:

Add-Migration CityProperty

Это команда создаст новую миграцию с названием CityProperty (мне нравится указывать в названии миграции изменения, которые она затрагивает — в данном случает мы добавили свойство City).

В папку Migrations будет добавлен новый файл класса, с названием, отражающим время, когда была выполнена миграция. Например, мой файл называется 201503262244036_CityProperty.cs.

Этот файл будет содержать данные для Entity Framework, описывающие изменения в схеме базы данных:

namespace Users.Migrations { using System; using System.Data.Entity.Migrations; public partial class CityProperty : DbMigration { public override void Up() { AddColumn(«dbo.AspNetUsers», «City», c => c.Int(nullable: false)); } public override void Down() { DropColumn(«dbo.AspNetUsers», «City»); } } }

Метод Up() описывает изменения, которые должны быть внесены в схему, когда база данных обновляется. В данном случае мы описали добавление столбца City в таблицу AppNetUsers, в которой сохранятся данные пользователей ASP.NET Identity.

Теперь необходимо выполнить миграцию. Без запуска приложения выполните следующую команду в панели Package Manager Console:

Update-Database –TargetMigration CityProperty

Схема базы данных будет изменена и код метода Configuration.Seed() будет выполнен. Существующие учетные записи пользователей будут сохранены и дополнятся новым столбцом City.

Тестирование миграции

Для тестирования миграции запустите приложение, перейдите по адресу /Home/UserProps и пройдите аутентификацию. После авторизации вы увидите текущее значение свойства City для пользователя и сможете его отредактировать:

Определение дополнительного свойства

Теперь, когда миграции базы данных настроены, мы определим еще одно пользовательское свойство для демонстрации обработки последующих изменений и покажем более полезный (и менее опасный) пример использования метода Configuration.Seed(). Давайте определим свойство Country в классе AppUser, как показано в примере ниже:

using System; using Microsoft.AspNet.Identity.EntityFramework; using System.ComponentModel.DataAnnotations; namespace Users.Models { public enum Cities { // … } public enum Countries { [Display(Name = «Не указано»)] NONE, [Display(Name = «Англия»)] ENG, [Display(Name = «Франция»)] FRA, [Display(Name = «Россия»)] RUS } public class AppUser : IdentityUser { public Cities City { get; set; } public Countries Country { get; set; } public void SetCountryFromCity(Cities city) { switch (city) { case Cities.LONDON: Country = Countries.ENG; break; case Cities.PARIS: Country = Countries.FRA; break; case Cities.MOSCOW: Country = Countries.RUS; break; default: Country = Countries.NONE; break; } } } }

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

Следующий код содержит изменения, которые мы должны внести в класс Configuration – метод Seed() выбирает страну для свойства Country на основе свойства City, но только если значение Country содержит значение None:

namespace Users.Migrations { // … internal sealed class Configuration : DbMigrationsConfiguration { public Configuration() { // … } protected override void Seed(Users.Infrastructure.AppIdentityDbContext context) { // … foreach (AppUser dbUser in userMgr.Users) { if (dbUser.Country == Countries.NONE) dbUser.SetCountryFromCity(dbUser.City); } context.SaveChanges(); } } }

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

Нет смысла определять дополнительные свойства пользователя, если они не доступны в приложении, поэтому давайте добавим отображение страны в представлении UserProps.cshtml:

… …

Текущий город

Страна

@HomeController.GetCityName(Model.City)
@HomeController.GetCityName(Model.Country)

В следующем примере мы изменили метод действия UserProps контроллера Home и добавили инициализацию свойства Country через метод SetCountryFromCity():

public class HomeController : Controller { // … [Authorize] [HttpPost] public async Task UserProps(Cities city) { AppUser user = CurrentUser; user.City = city; user.SetCountryFromCity(city); await UserManager.UpdateAsync(user); return View(user); } // … }

Давайте теперь запустим процесс миграции, по аналогии с запуском миграции при добавлении свойства City. Выполните следующую команду в панели Package Manager Console:

Add-Migration CountryProperty

Это позволит создать еще один файл в папке Migrations с инструкциями по добавлению столбца Country. Чтобы применить миграции, выполните следующую команду:

Update-Database –TargetMigration CountryProperty

Миграции будут выполнены и столбец Country инициализируется названиями стран в зависимости от значения столбца City. Для тестирования нового свойства запустите приложение и перейдите по адресу /Home/UserProps:

Источник: https://professorweb.ru/my/ASP_NET/identity/level1/1_8.php

Понравилась статья? Поделить с друзьями: