Asp.net

Примечания

  1. Дино Эспозито. Microsoft ASP.NET 2.0. Базовый курс. — СПб: И. Д. Питер, 2007. — 688 с. — ISBN 978-5-91180-423-7. — ISBN 978-5-7502-0304-8.
  2. Платт Д. С. Знакомство с Microsoft .NET. — М.: И. Д. Русская редакция, 2001. — 240 с. — ISBN 5-7502-0186-4.
  3. ↑  (недоступная ссылка). The Architecture Journal. Microsoft (January 2007). Дата обращения 20 апреля 2008.
  4. Michiel van Otegem.  (недоступная ссылка) (July 24, 2007). Дата обращения 20 апреля 2008.
  5. Tim Anderson.  (недоступная ссылка). The Register (October 30, 2007). Дата обращения 20 апреля 2008.
  6.  (англ.). docs.microsoft.com.
  7.  (англ.). docs.microsoft.com.
  8.  (англ.). docs.microsoft.com.
  9. Мак-Дональд Мэтью, Фримен Адам, Шпушта Марио. Microsoft ASP.NET 4 с примерами на C# 2010 для профессионалов. — 4-е изд.. — М.: ООО «И.Д. Вильямс», 2011. — 1424 с. — ISBN 978-5-8459-1702-7. — ISBN 978-1-43-022529-4.
  10. . MSDN. Microsoft.
  11. Laurence Moroney, Matthew MacDonald. Pro ASP.NET 2.0 in VB 2005. — Apress, 2006. — 1296 с. — ISBN 978-1-59059-563-3.

Удаление пользователей

Класс управления пользователями UserManager<T> определяет метод DeleteAsync(), который принимает экземпляр класса пользователя (IdentityUser) и удаляет его из базы данных. В следующем примере вы можете увидеть, как я использовал этот метод в контроллере Admin:


Метод действия Delete принимает уникальный идентификатор пользователя в качестве строкового параметра, после чего мы используем метод FindByIdAsync(), чтобы найти объект пользователя с таким идентификатором. Метод DeleteAsync() возвращает объект типа IdentityResult, который я проверяю также, как и в предыдущих примерах на наличие ошибок. Вы можете протестировать новую функциональность — создайте нового пользователя, а затем нажмите «Удалить» рядом с именем пользователя в представлении Index.

В данном примере мы не создавали отдельного представления Delete, поэтому для отображения ошибок создайте файл с названием Error.cshtml в папке /Views/Shared со следующей разметкой:

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

Формы HTML

Тем, кто знаком с языком HTML, известно, что наиболее простым способом отправки клиентских данных серверу является использование дескриптора <form>. Внутри дескриптора <form> можно размещать дескрипторы <input>, представляющие другие базовые элементы пользовательского интерфейса, вроде кнопок, текстовых полей, окон списков и переключателей.

Например, ниже показана HTML-страница с формой, которая содержит два текстовых поля, два флажка и кнопку отправки, т.е. всего пять дескрипторов <input>:

На рисунке показано, как эта простая страница будет выглядеть в окне веб-браузера:

Когда пользователь щелкает на кнопке Submit (Отправить), браузер извлекает текущие значения каждого элемента управления и формирует из них длинную строку. Затем эта строка отправляется странице, указанной в дескрипторе <form> (в данном случае page.aspx) с использованием HTTP-операции POST. В данном примере это означает, что веб-сервер может получить запрос со следующей строкой информации:

FirstName=Василий&LastName=Пупкин&CS=on&VB=on 

При создании этой строки браузер соблюдает определенные правила. Информация всегда отправляется в виде последовательности пар «имя-значение», разделенных символом амперсанда (&). Внутри пары имя отделяется от значения знаком равенства (=). Флажки игнорируются до тех пор, пока не будут выбраны, в таком случае браузер передает в качестве значения текст on. Полную информацию о стандарте форм HTML, поддерживаемом в каждом текущем браузере, можно найти на W3C — Forms.

Фактически все серверные каркасы программирования добавляют уровень абстракции к необработанным данным формы. Они разбивают эту строку и представляют ее более полезным способом. Например, JSP, ASP и ASP.NET позволяют извлекать значение элемента управления формы с использованием тонкого объектного уровня. В ASP и ASP.NET значения можно искать по имени в коллекции Request.Form. Если преобразовать предыдущую страницу в веб-форму ASP.NET, тогда этот подход можно будет применить с помощью такого кода:

Этот тонкий «слой» поверх сообщения POST полезен, но все же далек от истинной объектно-ориентированной структуры. Вот почему в ASP.NET делается еще один шаг вперед. Когда страница отправляется обратно среде ASP.NET, она извлекает значения, заполняет коллекцию Form (для обратной совместимости с кодом ASP) и затем конфигурирует соответствующие объекты элементов управления. Это означает, что для извлечения информации из веб-формы ASP.NET можно использовать следующий намного более содержательный синтаксис:

Данный код также обладает преимуществом безопасности типов. Иначе говоря, при извлечении состояния флажка вы получите булевское значение true или false вместо слова on. В результате разработчики оказываются изолированными от индивидуальных особенностей синтаксиса HTML.

В ASP.NET все элементы управления помещены в отдельный дескриптор <form>. Этот дескриптор помечен атрибутом runat=»server», который позволяет ему работать на сервере. ASP.NET не допускает создание веб-форм, содержащих более одного серверного дескриптора <form>, хотя можно создавать страницы, выполняющие отправку информации другим страницам, с использованием технологии межстраничной отправки.

Извлечение пользователей из хранилища

Первая задача, которую придется выполнять посредством класса Membership — извлечение отдельного пользователя и списка пользователей из хранилища информации о членстве. Для этой цели создается простая страница с элементом управления GridView для привязки списка пользователей:

Как видите, GridView определяет поле UserName как DataKeyName. Это позволяет обращаться к значению UserName текущего выбранного пользователя непосредственно через свойство SelectedValue элемента управления GridView. Поскольку большинство методов требуют имя пользователя для получения деталей, это очень удобно. Имея такую страницу, можно добавить следующий код в процедуру события Page_Load для загрузки пользователей из хранилища членства и привязки их к экранной таблице:


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

Как видите, класс Membership включает метод GetAllUsers(), который возвращает экземпляр типа MembershipUserCollection. Эту коллекцию можно использовать подобно любой другой. Каждый ее элемент содержит все свойства одного пользователя. Таким образом, если нужно отобразить подробности о выбранном пользователе, понадобится просто добавить пару элементов управления для отображения содержимого выбранного пользователя на ранее созданной странице, как показано ниже:

Затем можно перехватить событие SelectedIndexChanged ранее добавленного элемента управления GridView для заполнения этих полей соответствующими значениями:

Объект MembershipCollection требует имени пользователя для прямого доступа к нему. Методы класса Membership, такие как GetUser(), также требуют имени пользователя. Таким образом, поле UserName используется как значение свойства DataKeyNames. Имея экземпляр MembershipUser, вы получаете доступ к свойствам пользователя обычным образом.

Подготовка к реализации системы аутентификации

Даже несмотря на то, что наш запрос на данный момент заканчивается ошибкой, мы наглядно показали как вписывается Identity в жизненный цикл приложения ASP.NET. Следующий шаг — создать контроллер, обрабатывающий запрос к URL /Account/Login, для отображения формы входа в приложение. Добавьте сначала новый класс view-model в файл UserViewModels.cs:

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

Теперь добавьте контроллер Account в наше приложение, с кодом, показанным в примере ниже, который содержит две перегруженные версии метода Login

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

Хотя этот код еще не относится к аутентификации пользователей, контроллер Account все же содержит некоторую полезную инфраструктуру, не относящуюся к ASP.NET Identity.

Во-первых, обратите внимание, что оба метода Login принимают строковый аргумент returnUrl. Когда пользователь запрашивает URL-адрес с ограниченным доступом, он перенаправляется по адресу /Account/Login со строкой запроса, содержащей адрес страницы с ограниченным доступом

Например, если сейчас вы запросите адрес /Home/Index, вас перенаправит на URL следующего вида:

/Account/Login?ReturnUrl=%2FHome%2FIndex

С помощью параметра ReturnUrl мы сможем перенаправить пользователя, успешно прошедшего аутентификацию, на страницу, с которой он пришел. Это обеспечивает простой и понятный процесс навигации пользователя в приложении при аутентификации.

Далее обратите внимание на атрибуты, которые я применил к контроллеру и его методам действий. Функции контроллера Account (такие как смена пароля, например) по умолчанию должны быть доступны только авторизованным пользователям

Для этого мы применили атрибут Authorize к контроллеру Account и добавили атрибут AllowAnonymous к некоторым методам действий. Это позволяет ограничить методы действий для авторизованных пользователей по умолчанию, но открыть доступ неавторизованным пользователям для входа в приложение.

Наконец, мы добавили атрибут ValidateAntiForgeryToken который работает в связке с классом HtmlHelper, используемом в Razor в представлениях cshtml. Вспомогательный метод AntiForgeryToken защищает от межсайтовой подделки запросов CSRF, благодаря тому, что генерирует скрытое поле формы с токеном, который проверяется при отправке формы.


Последний подготовительный шаг — создание формы входа в приложение. Добавьте в папку /Views/Account файл представления Login.cshtml:

В этой разметке стоит обратить внимание на использование вспомогательного метода Html.AntiForgeryToken и создание скрытое поля с сохранением параметра returnUrl. В остальном — это обычная форма, генерируемая с помощью Razor

Итак, мы завершили подготовку к созданию системы аутентификации. Запустите приложение и перейдите по адресу /Home/Index – система перенаправит вас на страницу входа:

Безопасность

В ASP.NET, для управления системой аутентификации пользователей на сайте, был реализован за счет Membership API, который представляет средства для входа, хранения и управления учетными записями пользователей. Архитектура Membership API выстроена таким образом, что позволяет управлять пользователями хранящимся в различных источниках: Microsoft SQL Server, Microsoft Active Directory или специальное хранилище (реализованное самим, но тогда необходимо самому реализовывать поставщик, чтобы подключиться к обобщенной базе поставщиков). В ASP.NET аутентификация может осуществляется с помощью форм, либо с помощью Windows через IIS.

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

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

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

Enable-Migrations –EnableAutomaticMigrations

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

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

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

Помимо создания администратора, мы инициализировали свойство City значением по умолчанию:

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

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

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

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

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

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

Это команда создаст новую миграцию с названием CityProperty (мне нравится указывать в названии миграции изменения, которые она затрагивает — в данном случает мы добавили свойство City). В папку Migrations будет добавлен новый файл класса, с названием, отражающим время, когда была выполнена миграция. Например, мой файл называется 201503262244036_CityProperty.cs. Этот файл будет содержать данные для Entity Framework, описывающие изменения в схеме базы данных:

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

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

Update-Database –TargetMigration CityProperty

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

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

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

Типы поставщиков

Существует несколько форм ASP-бизнеса. Это:

  • Специалист или функциональный ASP обеспечивает единое приложение, например, для обработки кредитных карт оплаты или расписаний услуг;
  • Вертикальный рынок ASP обеспечивает решение пакет для конкретного типа клиента, например, стоматологическая практикой;
  • Предприятие ASP обеспечивает широкие решения спектра;
  • Местный ASP обеспечивает малый бизнес услуг в пределах ограниченной области.

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

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

Редактирование пользователей

Для завершения панели администратора, мы добавим возможность редактирования адреса электронной почты и пароля для пользователя. Отмечу, что это стандартные свойства класса IdentityUser, позже, я покажу как можно редактировать пользовательские свойства.

В следующем примере мы добавили два новых метода действий Edit в контроллер Admin:

Первый метод действия Edit обрабатывает GET-запросы с идентификатором пользователя, выполняет поиск с помощью метода FindByIdAsync() и возвращает представление Edit.cshtml с возможностью редактирования если пользователь найден, иначе перенаправляет обратно на представление Index.

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

Первая задача — выполнить валидацию значений, которые мы получаем из формы. В данном примере мы работаем с простым объектом данных пользователя, однако, позже я покажу вам, как взаимодействовать с более сложными объектами. Итак, нам необходимо выполнить проверки данных пользователя и пароля, которые мы добавили в предыдущей статье в класс AddUserManager. Начинаем с проверки адреса электронной почты:

Следующий шаг — сменить пароль, если таковой был предоставлен. ASP.NET Identity не хранит пароли в чистом виде, а использует их хэш. Поэтому, мы сначала проверяем пароль, затем генерируем его хэш и сохраняем в свойстве PasswordHash.

Пароли преобразуются в хэш через реализацию интерфейса IPasswordHasher (в данном случае используется свойство AppUserManager.PasswordHasher). Интерфейс IPasswordHasher определяет метод HashPassword(), который принимает строковый аргумент и возвращает его хэшированное значение:

Изменения пользовательских данных не сохраняются в базе данных вплоть до вызова метода UpdateAsync():

Теперь нам осталось добавить только представление для редактирования данных пользователя, которое будет выводить в текстовых полях текущие значения имени и адреса электронной почты пользователя. Добавьте в проект файл /Views/Admin/Edit.cshtml со следующим содержимым:

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

Итак, ранее мы ознакомились с тем, как нужно конфигурировать систему ASP.NET Identity и создали простое приложение администрирования пользователей с возможностью просмотра всех пользователей, добавления новых, редактирования и удаления существующих пользователей. В последующих статьях я покажу вам как настроить аутентификацию и авторизацию по ролям, использовать OAuth 2.0 и многое другое.

Преимущества ASP.NET перед ASP

  • Компилируемый код выполняется быстрее, большинство ошибок отлавливается ещё на стадии разработки;
  • Значительно улучшенная обработка ошибок во время выполнения запущенной готовой программы, с использованием блоков try..catch;
  • Пользовательские элементы управления (controls) позволяют выделять часто используемые шаблоны, такие как меню сайта;
  • Использование метафор, уже применяющихся в Windows-приложениях, например, таких как элементы управления и события;
  • Расширяемый набор элементов управления и библиотек классов позволяет быстрее разрабатывать приложения;
  • ASP.NET опирается на многоязыковые возможности .NET, что позволяет писать код страниц на VB.NET, Delphi.NET, Visual C#, J# и т. д.;
  • Возможность кэширования всей страницы или её части для увеличения производительности;
  • Возможность кэширования данных, используемых на странице;
  • Возможность разделения визуальной части и бизнес-логики по разным файлам («code behind»);
  • Расширяемая модель обработки запросов;
  • Расширенная событийная модель;
  • Расширяемая модель серверных элементов управления;
  • Наличие master-страниц для задания шаблонов оформления страниц;
  • Поддержка CRUD-операций при работе с таблицами через GridView;
  • Встроенная поддержка AJAX;

Модель ASP

Прикладное программное обеспечение находится в системе поставщика и доступно пользователям через веб-браузер с использованием HTML или специального программного обеспечения клиента, предоставляемого поставщиком. Пользовательское клиентское программное обеспечение также может взаимодействовать с этими системами через XML API . Эти API также могут использоваться там, где требуется интеграция с внутренними системами. ASP могут использовать или не использовать многопользовательскую установку при развертывании программного обеспечения для клиентов; некоторые ASP предлагают экземпляр или лицензию для каждого клиента (например, с помощью виртуализации), некоторые из них развертываются в режиме доступа к нескольким арендаторам с одним экземпляром, теперь более часто называемым « SaaS ».

Общие функции, связанные с ASP, включают:

  • ASP полностью владеет и управляет программным приложением (приложениями)
  • ASP владеет, управляет и обслуживает серверы, поддерживающие программное обеспечение
  • ASP предоставляет доступную информацию клиентам через Интернет или « тонкий клиент »,
  • ASP-счета на основе «за использование» или ежемесячную / годовую плату

К преимуществам такого подхода относятся:

  • Проблемы с интеграцией программного обеспечения устраняются с клиентского сайта
  • Затраты на программное обеспечение для приложения распространяются на несколько клиентов
  • Поставщики могут создавать больше опыта приложений, чем собственный персонал
  • Платформы разработки с низким кодом позволяют ограничить настройку предварительно созданных приложений
  • Ключевые программные системы постоянно обновляются, доступны и управляются специалистами
  • Повышенная надежность, доступность, масштабируемость и безопасность внутренних ИТ-систем
  • Соглашение об уровне обслуживания поставщика гарантирует определенный уровень обслуживания
  • Доступ к экспертам по продуктам и технологиям, посвященным имеющимся продуктам
  • Снижение внутренних затрат на ИТ до предсказуемой ежемесячной платы
  • Повторное развертывание ИТ-персонала и инструментов для сосредоточения внимания на стратегических технологических проектах, которые влияют на итоговую прибыль предприятия

К числу присущих им недостатков относятся:

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

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

  • Потеря контроля над корпоративными данными
  • Потеря контроля над корпоративным имиджем
  • Недостаточная безопасность ASP для противодействия рискам
  • Экспонирование корпоративных данных другим пользователям ASP
  • Компромисс корпоративных данных

Некоторые другие риски включают в себя неспособность учитывать финансовое будущее ASP в целом, то есть насколько стабильной является компания, и если у нее есть ресурсы для продолжения бизнеса в обозримом будущем. По этим причинам Cisco Systems разработала всеобъемлющий оценочный ориентир. Это руководство включает оценку сферы обслуживания ASP, безопасность программы и зрелость ASP в отношении безопасности

Наконец, в руководящих принципах указывается на важность проведения аудитов в ASP в отношении:

  • Порт / Сетевое обслуживание
  • Уязвимость приложения
  • Персонал ASP

Физические посещения ASP для оценки формальности организации обеспечат бесценное понимание осведомленности о фирме.

How to Convert an ASPX File

ASPX files have an explicit purpose. Unlike image files, like PNG, JPG, GIF, etc. where a file conversion retains compatibility with most image editors and viewers, ASPX files will stop doing what they’re meant to do if you convert them to other file formats.

Converting ASPX to HTML, for example, will certainly make the HTML result look like the ASPX web page. However, since the elements of the ASPX files are processed on a server, you can’t use them properly if they exist as HTML, PDF, JPG, or any other file you convert them to on your computer.

However, given that there are programs that use ASPX files, you can save the ASPX file as something else if you open it in an ASPX editor. Visual Studio, for example, can save open ASPX files as HTM, HTML, ASP, WSF, VBS, ASMX, MSGX, SVC, SRF, JS, and others.


С этим читают