Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
С тех пор как была написана эта статья, поставщики членских учетных записей ASP.NET были заменены ASP.NET Identity. Настоятельно рекомендуется обновить приложения для использования платформы ASP.NET identity, а не поставщиков членства, которые были представлены в то время, когда эта статья была написана. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, в том числе:
- Улучшенная производительность
- Улучшенная расширяемость и возможность тестирования
- Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
- Поддержка идентификации на основе утверждений
- Улучшение взаимодействия с ASP.Net Core
В этом руководстве мы перейдем от обсуждения к реализации; особенно разберем аутентификацию с использованием форм. Веб-приложение, которое мы начнем создавать в этом руководстве, продолжит строиться в последующих руководствах, так как мы переходим от простой аутентификации форм к членству и ролям.
Дополнительную информацию по этой теме см. в этом видео: Использование базовой аутентификации с формами в ASP.NET.
Введение
В предыдущем руководстве мы обсудили различные параметры проверки подлинности, авторизации и учетной записи пользователя, предоставляемые ASP.NET. В этом руководстве мы перейдем от простого обсуждения к реализации. В частности, мы рассмотрим реализацию аутентификации форм. Веб-приложение, которое мы начнем создавать в этом руководстве, будет по-прежнему создано в последующих руководствах, так как мы переходим от простой проверки подлинности форм к членству и ролям.
В этом руководстве начинается подробный обзор рабочего процесса проверки подлинности форм, который мы рассмотрели в предыдущем руководстве. После этого мы создадим веб-сайт ASP.NET, с помощью которого можно провести демонстрацию концепций проверки подлинности форм. Затем мы настроим сайт для использования проверки подлинности форм, создадим простую страницу входа и посмотрим, как определить, выполняется ли проверка подлинности пользователя и, если да, имя пользователя, с которым они вошли.
Понимание рабочего процесса проверки подлинности с использованием форм, активация его в веб-приложении и создание страниц для входа и выхода из системы являются жизненно важными этапами в создании приложения ASP.NET, которое поддерживает учетные записи пользователей и выполняет аутентификацию пользователей через веб-страницу. Из-за этого , и потому что эти учебники опираются друг на друга - я бы призвал вас работать с этим руководством в полном объеме, прежде чем перейти к следующему, даже если у вас уже есть опыт настройки проверки подлинности форм в прошлых проектах.
Общие сведения о рабочем процессе проверки подлинности форм
Когда среда выполнения ASP.NET обрабатывает запрос на ASP.NET ресурс, например страницу ASP.NET или веб-службу ASP.NET, запрос вызывает ряд событий во время жизненного цикла. В самом начале и самом конце запроса возникают события, возникающие при проверке подлинности и авторизации запроса, событие, возникшее в случае необработанного исключения, и т. д. Чтобы просмотреть полный список событий, обратитесь к событиям объекта HttpApplication.
Модули HTTP — это управляемые классы , код которых выполняется в ответ на определенное событие в жизненном цикле запроса. ASP.NET поставляется с рядом модулей HTTP, выполняющих основные задачи за кулисами. Два встроенных модуля HTTP, которые особенно важны для нашего обсуждения:
- FormsAuthenticationModule — проверяет подлинность пользователя, проверяя запрос проверки подлинности форм, который обычно включается в коллекцию файлов cookie пользователя. Если билет проверки подлинности форм отсутствует, пользователь является анонимным.
- UrlAuthorizationModule — определяет, разрешен ли текущий пользователь получить доступ к запрошенным URL-адресам. Этот модуль определяет авторитет, обращаясь к правилам авторизации, указанным в файлах конфигурации приложения. ASP.NET также включает FileAuthorizationModule, который определяет полномочия, консультируясь с ACL запрошенных файлов.
FormsAuthenticationModule пытается пройти проверку подлинности пользователя до выполнения UrlAuthorizationModule (и FileAuthorizationModule). Если пользователь, выполняющий запрос, не авторизован для доступа к запрошенным ресурсам, модуль авторизации завершает запрос и возвращает состояние HTTP 401 несанкционированного доступа. В сценариях аутентификации Windows статус HTTP 401 возвращается в браузер. Этот код состояния приводит к тому, что браузер запрашивает у пользователя свои учетные данные через модальное диалоговое окно. Однако при проверке подлинности форм состояние HTTP 401 Unauthorized никогда не отправляется в браузер, так как FormsAuthenticationModule обнаруживает это состояние и изменяет его для перенаправления пользователя на страницу входа (через состояние перенаправления HTTP 302 ).
Ответственность страницы входа заключается в том, чтобы определить, действительны ли учетные данные пользователя и, если да, создать билет проверки подлинности форм и перенаправить пользователя обратно на страницу, которую они пытались посетить. Запрос проверки подлинности включается в последующие запросы на страницы на веб-сайте, который FormsAuthenticationModule использует для идентификации пользователя.
Рис. 01. Рабочий процесс проверки подлинности форм (щелкните, чтобы просмотреть изображение полного размера)
Запоминание токена аутентификации для посещений страниц
После входа запрос проверки подлинности форм должен быть отправлен обратно на веб-сервер по каждому запросу, чтобы пользователь оставался вошедший в систему при просмотре сайта. Обычно это достигается путем размещения аутентификационного токена в коллекции куки пользователя. Файлы cookie — это небольшие текстовые файлы, которые находятся на компьютере пользователя и передаются в заголовки HTTP по каждому запросу на веб-сайт, создавший файл cookie. Таким образом, после создания и хранения формы аутентификации в файлах cookie браузера, при каждом последующем визите на этот сайт билет аутентификации отправляется вместе с запросом, тем самым идентифицируя пользователя.
Замечание
Демонстрационное веб-приложение, используемое в каждом руководстве, доступно как скачивание. Это скачиваемое приложение было создано с помощью Visual Web Developer 2008, предназначенного для .NET Framework версии 3.5. Так как приложение предназначено для .NET 3.5, его Web.config-файл включает дополнительные элементы конфигурации 3.5. Короткий рассказ, если вы еще не установили .NET 3.5 на компьютере, скачиваемое веб-приложение не будет работать без первого удаления разметки 3.5 из Web.config.
Одним из аспектов файлов cookie является их срок действия, который является датой и временем, в течение которого браузер удаляет файл cookie. После истечения срока действия файла cookie проверки подлинности форм пользователь больше не может пройти проверку подлинности и следовательно стать анонимным. Скорее всего, когда пользователь заходит в систему с общедоступного терминала, они хотят, чтобы срок действия их токена аутентификации истекал при закрытии браузера. Однако при посещении из дома тот же пользователь может захотеть, чтобы билет аутентификации запомнился между перезапусками браузера, чтобы им не приходилось повторно входить в систему при каждом посещении сайта. Это решение часто принимается пользователем в виде флажка "Запомнить меня" на странице входа. На шаге 3 мы рассмотрим, как реализовать флажок "Запомнить меня" на странице входа. В следующем руководстве подробно рассматриваются параметры времени ожидания проверки подлинности.
Замечание
Возможно, агент пользователя, используемый для входа на веб-сайт, может не поддерживать файлы cookie. В таком случае ASP.NET может использовать билеты аутентификации без использования файлов cookie. В этом режиме запрос проверки подлинности закодирован в URL-адрес. Мы рассмотрим, когда используются билеты проверки подлинности без файлов cookie и как они создаются и управляются в следующем руководстве.
Область проверки подлинности форм
FormsAuthenticationModule — это управляемый код, который является частью среды выполнения ASP.NET. До версии 7 веб-сервера Microsoft IIS существовал отдельный барьер между HTTP-пайплайном IIS и пайплайном среды выполнения ASP.NET. Короче говоря, в IIS 6 и более ранних версиях FormsAuthenticationModule выполняется только при делегировании запроса из IIS в среду выполнения ASP.NET. По умолчанию IIS сам обрабатывает статическое содержимое - такие как HTML-страницы, файлы CSS и изображения - и передает запросы на выполнение ASP.NET только когда запрашивается страница с расширением .aspx, .asmx или .ashx.
Однако IIS 7 позволяет интегрировать конвейер обработки IIS и ASP.NET. С помощью нескольких параметров конфигурации можно настроить IIS 7 для вызова FormsAuthenticationModule для всех запросов. Кроме того, с помощью IIS 7 можно определить правила авторизации URL-адресов для файлов любого типа. Дополнительные сведения см. в разделе "Изменения между безопасностью IIS6 и IIS7", "Безопасность веб-платформы" и "Общие сведения о авторизации URL-адресов IIS7".
Короче говоря, в версиях до IIS 7 можно использовать только проверку подлинности форм для защиты ресурсов, обрабатываемых средой выполнения ASP.NET. Аналогичным образом правила авторизации URL-адресов применяются только к ресурсам, обрабатываемых средой выполнения ASP.NET. Но с IIS 7 можно интегрировать FormsAuthenticationModule и UrlAuthorizationModule в http-конвейер IIS, тем самым расширяя эту функцию ко всем запросам.
Шаг 1. Создание веб-сайта ASP.NET для этой серии учебников
Чтобы достичь максимально возможной аудитории, веб-сайт ASP.NET, который мы создадим в рамках этой серии, будет создан с бесплатной версией Visual Studio 2008, Visual Web Developer 2008. Мы реализуем хранилище пользователей SqlMembershipProvider в базе данных Microsoft SQL Server 2005 Express Edition . Если вы используете Visual Studio 2005 или другой выпуск Visual Studio 2008 или SQL Server, не беспокойтесь, шаги будут почти идентичными, и все нетривиальные различия будут указываться.
Прежде чем настроить проверку подлинности форм, сначала нам нужен веб-сайт ASP.NET. Начните с создания веб-сайта ASP.NET на основе файловой системы. Для этого запустите Visual Web Developer, а затем перейдите в меню "Файл" и выберите "Новый веб-сайт", отображая диалоговое окно "Новый веб-сайт". Выберите шаблон веб-сайта ASP.NET, установите раскрывающийся список "Расположение" в файловой системе, выберите папку для размещения веб-сайта и задайте язык VB. При этом будет создан новый веб-сайт со страницей Default.aspx ASP.NET, папкой App_Data и файлом Web.config.
Замечание
Visual Studio поддерживает два режима управления проектами: проекты веб-сайта и проекты веб-приложений. Проекты веб-сайта не имеют файла проекта, в то время как проекты веб-приложения имитируют архитектуру проекта в Visual Studio .NET 2002/2003, они включают файл проекта и компилируют исходный код проекта в одну сборку, которая помещается в папку /bin. Visual Studio 2005 изначально поддерживает только проекты веб-сайта, хотя модель проекта веб-приложения была повторно введена с пакетом обновления 1 (SP1); Visual Studio 2008 предлагает обе модели проектов. Однако выпуски Visual Web Developer 2005 и 2008 поддерживают только проекты веб-сайта. Я буду использовать модель проекта веб-сайта. Если вы используете выпуск, отличный от Express, и хотите использовать модель проекта веб-приложения , вы можете сделать это, но помните, что могут быть некоторые несоответствия между тем, что вы видите на экране, и шаги, которые необходимо предпринять, и снимки экрана, показанные и инструкции, приведенные в этих руководствах.
Рис. 02. Создание нового веб-сайта на базе файловой системы (Щелкните, чтобы увидеть изображение в полном размере)
Добавление главной страницы
Затем добавьте новую главную страницу на сайт в корневом каталоге с именем Site.master. Главные страницы позволяют разработчику страниц определять шаблон на уровне сайта, который можно применить к ASP.NET страницам. Основное преимущество главных страниц заключается в том, что общий внешний вид сайта можно определить в одном расположении, что упрощает обновление или изменение макета сайта.
Рис. 03. Добавление главной страницы с именем Site.master на веб-сайт (щелкните, чтобы просмотреть изображение полного размера)
Определите макет страницы на уровне сайта на главной странице. Вы можете использовать дизайнерский режим и добавить нужные элементы макета или веб-элементы управления, либо вручную добавить HTML-разметку в режиме исходного кода. Я структурировал макет главной страницы, чтобы имитировать макет, используемый в моей работе с данными в серии учебников ASP.NET 2.0 (см. рис. 4). На главной странице используются каскадные таблицы стилей для размещения и стилей с параметрами CSS, определенными в файле Style.css (который включен в связанное с этим руководством скачивание). Хотя вы не можете определить из разметки, показанной ниже, правила CSS определены таким образом, чтобы содержимое <div> навигации было абсолютно позиционировано так, чтобы оно отображалось слева и имело фиксированную ширину 200 пикселей.
<%@ Master Language="VB" CodeFile="Site.master.vb" Inherits="Site" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Forms Authentication, Authorization, and User Accounts</title>
<link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="wrapper">
<form id="form1" runat="server">
<div id="header">
<span class="title">User Account Tutorials</span>
</div>
<div id="content">
<asp:contentplaceholder id="MainContent" runat="server">
<!-- Page-specific content will go here... -->
</asp:contentplaceholder>
</div>
<div id="navigation">
TODO: Menu will go here...
</div>
</form>
</div>
</body>
</html>
Эталонная страница определяет как статический макет страницы, так и регионы, которые можно изменить на страницах ASP.NET, использующих главную страницу. Эти редактируемые области содержимого обозначены с помощью элемента управления ContentPlaceHolder, который можно увидеть внутри тега <div> содержимого. На главной странице есть один ContentPlaceHolder (MainContent), но на главной странице может быть несколько ContentPlaceHolders.
При введении разметки выше переключение на режим конструктора отображает макет основной страницы. Все ASP.NET страницы, использующие эту главную страницу, будут иметь этот универсальный макет, с возможностью указания разметки для региона MainContent.
Рис. 04.Эталонная страница при просмотре в режиме конструктора (щелкните, чтобы просмотреть изображение полного размера)
Создание страниц содержимого
На этом этапе у нас есть страница Default.aspx на нашем веб-сайте, но она не использует только что созданную главную страницу. Хотя можно управлять декларативной разметкой веб-страницы для использования главной страницы, если страница не содержит содержимого, но проще просто удалить страницу и повторно добавить ее в проект, указав главную страницу для использования. Поэтому сначала удалите Default.aspx из проекта.
Затем щелкните правой кнопкой мыши имя проекта в обозревателе решений и выберите новую веб-форму с именем Default.aspx. На этот раз установите флажок "Выбор главной страницы" и выберите главную страницу Site.master из списка.
Рис. 05. Добавить новую страницу Default.aspx, выбор главной страницы (щелкните для просмотра изображения в полном размере)
Рис. 06. Использование главной страницы Site.master (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Если вы используете модель проекта веб-приложения, диалоговое окно "Добавление нового элемента" не включает флажок "Выбор главной страницы". Вместо этого необходимо добавить элемент формы веб-содержимого. После выбора параметра "Форма веб-содержимого" и нажатия кнопки "Добавить" Visual Studio отобразит то же диалоговое окно "Выбор объекта мастера", которое показано на рисунке 6.
Декларативная разметка новой страницы Default.aspx включает только @Page директиву, указывающую путь к главному файлу страницы и элемент управления "Содержимое" главной страницы MainContent ContentPlaceHolder.
<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>
Теперь оставьте Default.aspx пустым. Далее мы вернемся к нему в этом руководстве, чтобы добавить содержимое.
Замечание
Наша эталонная страница содержит раздел для меню или другого интерфейса навигации. Мы создадим такой интерфейс в будущем руководстве.
Шаг 2. Включение проверки подлинности форм
При создании веб-сайта ASP.NET наша следующая задача — включить проверку подлинности форм. Конфигурация проверки подлинности приложения указывается с помощью <элемента проверки подлинности> в Web.config. Элемент <проверки подлинности содержит один атрибут именованного режима, который указывает модель проверки подлинности>, используемую приложением. Этот атрибут может иметь одно из следующих четырех значений:
- Windows — как описано в предыдущем руководстве, когда приложение использует проверку подлинности Windows, это ответственность веб-сервера для проверки подлинности посетителя, и это обычно выполняется с помощью базовой, дайджест-проверки подлинности или встроенной проверки подлинности Windows.
- Формы— пользователи проходят проверку подлинности с помощью формы на веб-странице.
- Пользователи Passport— проходят проверку подлинности с помощью сети Microsoft Passport.
- Нет— модель проверки подлинности не используется; все посетители анонимны.
По умолчанию ASP.NET приложения используют проверку подлинности Windows. Чтобы изменить тип проверки подлинности на проверку подлинности форм, необходимо изменить <атрибут режима проверки подлинности> на Forms.
Если проект еще не содержит файл Web.config, добавьте его, щелкнув правой кнопкой мыши имя проекта в обозревателе решений, выбрав "Добавить новый элемент" и добавив файл веб-конфигурации.
Рис. 07. Если проект еще не включает Web.config, добавьте его (щелкните, чтобы просмотреть изображение полного размера)
Затем найдите <элемент аутентификации> и обновите его, чтобы использовать аутентификацию на основе форм. После этого изменения разметка файла Web.config должна выглядеть следующим образом:
<configuration>
<system.web>
... Unrelated configuration settings and comments removed for brevity ...
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms" />
</system.web>
</configuration>
Замечание
Так как Web.config является XML-файлом, регистр важен. Убедитесь, что для атрибута режима задано значение Forms с буквой F. При использовании другого регистра, например форм, при посещении сайта через браузер появится ошибка конфигурации.
Элемент <проверки подлинности может дополнительно включать дочерний >элемент форм<, содержащий параметры проверки подлинности> форм. Теперь давайте просто используем параметры проверки подлинности форм по умолчанию. Мы рассмотрим дочерний <элемент форм> более подробно в следующем руководстве.
Шаг 3. Создание страницы входа
Для поддержки проверки подлинности форм наш веб-сайт должен иметь страницу входа. Как описано в разделе "Общие сведения о рабочем процессе проверки подлинности форм", служба FormsAuthenticationModule автоматически перенаправит пользователя на страницу входа, если они пытаются получить доступ к странице, которую они не авторизованы для просмотра. Существуют также ASP.NET веб-элементы управления, которые будут отображать ссылку на страницу входа анонимным пользователям. В этом случае возникает вопрос, что такое URL-адрес страницы входа?
По умолчанию система проверки подлинности форм ожидает, что страница входа будет называться Login.aspx и помещается в корневой каталог веб-приложения. Если вы хотите использовать другой URL-адрес страницы входа, это можно сделать, указав его в Web.config. Мы посмотрим, как это сделать в следующем руководстве.
Страница входа имеет три обязанности:
- Укажите интерфейс, позволяющий посетителю вводить свои учетные данные.
- Определите, являются ли отправленные учетные данные действительными.
- Войдите в систему, создав билет проверки подлинности форм.
Создание пользовательского интерфейса страницы входа
Давайте начнем с первой задачи. Добавьте новую страницу ASP.NET в корневой каталог сайта с именем Login.aspx и свяжите ее с главной страницей Site.master.
Рис. 08. Добавление новой страницы ASP.NET с именем Login.aspx(Щелкните, чтобы просмотреть изображение полного размера)
Типичный интерфейс страницы входа состоит из двух текстовых ящиков — одного для имени пользователя, одного для пароля — и кнопки для отправки формы. Веб-сайты часто включают флажок "Запомнить меня", который, если установлен, сохраняет полученный билет проверки подлинности во время перезапуска браузера.
Добавьте два текстовых поля в Login.aspx и задайте для свойства идентификатора имя пользователя и пароль соответственно. Также задайте для свойства TextMode значение Password. Затем добавьте элемент управления CheckBox, установив его свойство ID в значение RememberMe и свойство Text в значение "Запомнить меня". После этого добавьте кнопку с именем LoginButton, свойство Text которого имеет значение Login. Наконец, добавьте элемент управления Label для веба и установите его свойство ID в InvalidCredentialsMessage, а свойство Text установите на значение "Ваше имя пользователя или пароль неверны". Повторите попытку. Установите его свойство ForeColor в значение Red и свойство Visible в значение False.
На этом этапе экран должен выглядеть примерно так, как на снимке экрана на рис. 9, а декларативный синтаксис страницы должен выглядеть следующим образом:
<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="Login.aspx.vb" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<h1>
Login
</h1>
<p>
Username: <asp:TextBox ID="UserName" runat="server"></asp:TextBox>
</p>
<p>
Password: <asp:TextBox ID="Password" runat="server" TextMode="Password"></asp:TextBox>
</p>
<p>
<asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me" />
</p>
<p>
<asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" />
</p>
<p>
<asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again."
Visible="False"></asp:Label>
</p>
</asp:Content>
Рис. 09. Страница входа содержит два текстовых поля, флажок, кнопку и метку (щелкните, чтобы просмотреть изображение полного размера)
Наконец, создайте обработчик событий для события Click в LoginButton. В конструкторе просто дважды щелкните элемент управления "Кнопка", чтобы создать этот обработчик событий.
Определение допустимости предоставленных учетных данных
Теперь необходимо реализовать задачу 2 в обработчике события Click кнопки — определить, являются ли предоставленные учетные данные действительными. Для этого необходимо иметь хранилище пользователей, которое содержит все учетные данные пользователей, чтобы определить, совпадают ли предоставленные учетные данные с любыми известными учетными данными.
До ASP.NET 2.0 разработчики отвечали за реализацию как собственных хранилищ пользователей, так и написание кода для проверки предоставленных учетных данных в хранилище. Большинство разработчиков реализуют хранилище пользователей в базе данных, создавая таблицу с такими столбцами, как UserName, Password, Email, LastLoginDate и т. д. Затем эта таблица будет иметь одну запись для каждой учетной записи пользователя. Проверка предоставленных учетных данных пользователя будет включать запрос к базе данных для соответствующего имени пользователя, а затем гарантировать, что пароль в базе данных соответствует указанному паролю.
С ASP.NET 2.0 разработчики должны использовать один из поставщиков членства для управления хранилищем пользователей. В этой серии руководств мы будем использовать SqlMembershipProvider, которая использует базу данных SQL Server для пользовательского хранилища. При использовании SqlMembershipProvider необходимо реализовать определенную схему базы данных, которая включает таблицы, представления и хранимые процедуры, ожидаемые поставщиком. Мы рассмотрим, как реализовать эту схему в руководстве по созданию схемы членства в SQL Server . При наличии поставщика членства проверка учетных данных пользователя выполняется так же просто, как вызов метода ValidateUser(username, password), который возвращает логическое значение, указывающее, является ли допустимость сочетания имени пользователя и пароля. Видя, что мы еще не реализовали пользовательское хранилище SqlMembershipProvider, мы не можем использовать метод ValidateUser класса Членства в настоящее время.
Вместо того, чтобы создать собственную настраиваемую таблицу базы данных Users (которая будет устарела после реализации SqlMembershipProviderer), давайте вместо этого жестко закодируем допустимые учетные данные на самой странице входа. В обработчике событий Click в LoginButton добавьте следующий код:
Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginButton.Click
' Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
Dim users() As String = {"Scott", "Jisun", "Sam"}
Dim passwords() As String = {"password", "password", "password"}
For i As Integer = 0 To users.Length - 1
Dim validUsername As Boolean = (String.Compare(UserName.Text, users(i), True) = 0)
Dim validPassword As Boolean = (String.Compare(Password.Text, passwords(i), False) = 0)
If validUsername AndAlso validPassword Then
' TODO: Log in the user...
' TODO: Redirect them to the appropriate page
End If
Next
' If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = True
End Sub
Как видно, есть три допустимых учетных записей пользователей — Скотт, Цзисун и Сэм — и все три имеют один и тот же пароль (пароль). Код перебирает массивы пользователей и паролей в поисках верного имени пользователя и пароля. Если имя пользователя и пароль действительны, необходимо войти в систему, а затем перенаправить их на соответствующую страницу. Если учетные данные недействительны, мы отображаем метку InvalidCredentialsMessage.
Когда пользователь вводит допустимые учетные данные, я упомянул, что затем они перенаправляются на соответствующую страницу. Какая страница будет уместной? Помните, что при посещении пользователем страницы, которую они не авторизованы для просмотра, FormsAuthenticationModule автоматически перенаправляет их на страницу входа. При этом он включает запрошенный URL-адрес в строку запроса с помощью параметра ReturnUrl. То есть, если пользователь попытался посетить ProtectedPage.aspx, и они не были авторизованы для этого, FormsAuthenticationModule перенаправит их на:
Login.aspx? ReturnUrl=ProtectedPage.aspx
После успешного входа пользователь должен быть перенаправлен обратно в ProtectedPage.aspx. Кроме того, пользователи могут посетить страницу входа самостоятельно. В этом случае после входа в систему пользователь должен быть направлен на страницу Default.aspx в корневой папке.
Вход в систему пользователя
Если указанные учетные данные действительны, необходимо создать билет аутентификации форм, тем самым выполняя вход пользователя на сайт. Класс FormsAuthentication в пространстве имен System.Web.Security предоставляет ассортированные методы для входа и выхода пользователей с помощью системы проверки подлинности форм. Хотя в классе FormsAuthentication существует несколько методов, три, которые мы заинтересованы в этом этапе, являются следующими:
- GetAuthCookie(username, persistCookie) — создает запрос проверки подлинности форм для указанного имени пользователя. Затем этот метод создает и возвращает объект HttpCookie, содержащий содержимое билета проверки подлинности. Если параметр persistentCookie имеет значение True, создается постоянный файл cookie.
- SetAuthCookie(username, persistCookie) — вызывает метод GetAuthCookie (username, persistCookie) для создания файла cookie проверки подлинности форм. Затем этот метод добавляет файл cookie, возвращенный GetAuthCookie, в коллекцию cookie (если используется проверка подлинности форм на основе файлов cookie; в противном случае этот метод вызывает внутренний класс, обрабатывающий логику запроса без файлов cookie).
- RedirectFromLoginPage(username, persistCookie) — этот метод вызывает SetAuthCookie(username, persistCookie), а затем перенаправляет пользователя на соответствующую страницу.
GetAuthCookie удобно, когда необходимо изменить аутентификационный билет перед записью cookie в коллекцию cookies. SetAuthCookie полезен, если вы хотите создать билет проверки подлинности форм и добавить его в коллекцию cookie, но не хотите перенаправлять пользователя на соответствующую страницу. Возможно, вы хотите сохранить их на странице входа или отправить их на другую страницу.
Чтобы выполнить вход пользователя и перенаправить его на соответствующую страницу, используем RedirectFromLoginPage. Обновите обработчик события Click для LoginButton, заменив две закомментированные строки TODO следующим кодом:
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked)
При создании токена аутентификации форм мы используем свойство Text для поля TextBox UserName как параметр имени пользователя, а отмеченное состояние CheckBox RememberMe для параметра persistCookie.
Чтобы проверить страницу входа, посетите ее в браузере. Начните с ввода недопустимых учетных данных, таких как имя пользователя Nope и пароль wrong. После нажатия кнопки входа появится обратная связь, и отобразится метка InvalidCredentialsMessage.
Рис. 10. При вводе недопустимых учетных данных отображается метка InvalidCredentialsMessage (щелкните, чтобы просмотреть изображение полного размера)
Затем введите допустимые учетные данные и нажмите кнопку "Войти". На этот раз, когда происходит постбэк, создается билет проверки подлинности форм, и вы автоматически перенаправляетесь обратно на Default.aspx. На этом этапе вы вошли на веб-сайт, хотя визуальные подсказки не указывают на то, что вы вошли в систему. На шаге 4 мы посмотрим, как программно определить, входит ли пользователь в систему или нет, а также как определить пользователя, посещаемую страницу.
Шаг 5 рассматривает методы выхода пользователя с веб-сайта.
Защита страницы входа
Когда пользователь вводит свои учетные данные и отправляет форму страницы входа, учетные данные , включая пароль, передаются через Интернет на веб-сервер в виде обычного текста. Это означает, что любой хакер, прослушивающий сетевой трафик, может видеть имя пользователя и пароль. Чтобы предотвратить это, необходимо зашифровать сетевой трафик с помощью протоколов SSL. Это гарантирует, что учетные данные (а также разметка HTML всей страницы) шифруются с момента их выхода из браузера, пока они не будут получены веб-сервером.
Если ваш веб-сайт не содержит конфиденциальную информацию, вам потребуется использовать ssl только на странице входа и на других страницах, где пароль пользователя будет отправлен по проводу в виде обычного текста. Вам не нужно беспокоиться о защите билета проверки подлинности форм, так как по умолчанию он зашифрован и цифрово подписан (чтобы предотвратить изменение). Более подробное обсуждение безопасности запросов проверки подлинности форм представлено в следующем руководстве.
Замечание
Многие финансовые и медицинские веб-сайты настроены на использование SSL на всех страницах, доступных для прошедших проверку подлинности пользователей. Если вы создаете такой веб-сайт, вы можете настроить систему проверки подлинности форм, чтобы запрос проверки подлинности форм передается только через безопасное подключение.
Шаг 4. Обнаружение прошедших проверку подлинности посетителей и определение их удостоверения
На этом этапе мы включили проверку подлинности форм и создали rudimentary login page, но мы еще не рассмотрим, как можно определить, является ли пользователь прошедшим проверку подлинности или анонимным. В некоторых сценариях может потребоваться отобразить различные данные или сведения в зависимости от того, посещает ли страницу аутентифицированный или анонимный пользователь. Кроме того, часто необходимо знать личность пользователя, прошедшего проверку подлинности.
Давайте добавим существующую страницу Default.aspx, чтобы проиллюстрировать эти методы. В Default.aspx добавьте два элемента управления "Панель", один с именем AuthenticatedMessagePanel и другой с именем AnonymousMessagePanel. Добавьте элемент управления Label с именем WelcomeBackMessage на первой панели. На второй панели добавьте элемент управления HyperLink, задайте свойству Text значение Log In и свойству NavigateUrl значение ~/Login.aspx. На этом этапе декларативная разметка для Default.aspx должна выглядеть примерно так:
<%@ Page Language="VB" MasterPageFile="~/Site.master" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<asp:Panel runat="server" ID="AuthenticatedMessagePanel">
<asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
</asp:Panel>
<asp:Panel runat="Server" ID="AnonymousMessagePanel">
<asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
</asp:Panel>
</asp:Content>
Как вы, вероятно, уже догадались, идея состоит в том, чтобы отображать только ПанельАутентифицированныхСообщений для аутентифицированных посетителей и только ПанельАнонимныхСообщений для анонимных посетителей. Для этого необходимо задать свойства видимых панелей в зависимости от того, входит ли пользователь в систему.
Свойство Request.IsAuthenticated возвращает логическое значение, указывающее, прошел ли запрос проверку подлинности. Введите следующий код в код обработчика событий Page_Load:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Request.IsAuthenticated Then
WelcomeBackMessage.Text = "Welcome back!"
AuthenticatedMessagePanel.Visible = True
AnonymousMessagePanel.Visible = False
Else
AuthenticatedMessagePanel.Visible = False
AnonymousMessagePanel.Visible = True
End If
End Sub
Используя этот код, посетите Default.aspx через браузер. Если вы еще не войдете в систему, вы увидите ссылку на страницу входа (см. рис. 11). Щелкните эту ссылку и войдите на сайт. Как мы видели на шаге 3, после ввода учетных данных вы вернеесь в Default.aspx, но на этот раз на странице отображается приветствие назад! сообщение (см. рис. 12).
Рис. 11. При анонимном посещении отображается ссылка на вход (щелкните, чтобы просмотреть изображение полного размера)
Рис. 12. Пользователям, прошедшим проверку подлинности, показывается «С возвращением!». Сообщение(Щелкните, чтобы просмотреть изображение полного размера)
Мы можем определить удостоверение текущего вошедшего пользователя через свойство User объекта HttpContext. Объект HttpContext представляет сведения о текущем запросе и является домом для таких распространенных ASP.NET объектов, как ответ, запрос и сеанс, среди прочего. Свойство User представляет контекст безопасности текущего HTTP-запроса и реализует интерфейс IPrincipal.
Свойство User задается в FormsAuthenticationModule. В частности, когда FormsAuthenticationModule находит запрос проверки подлинности форм в входящем запросе, он создает новый объект GenericPrincipal и назначает его свойству User.
Основные объекты (например, GenericPrincipal) предоставляют сведения об удостоверении пользователя и ролях, к которым они относятся. Интерфейс IPrincipal определяет два элемента:
- IsInRole(roleName) — метод, возвращающий логическое значение, указывающее, принадлежит ли субъект указанной роли.
- Identity — свойство, возвращающее объект, реализующий интерфейс IIdentity. Интерфейс IIdentity определяет три свойства: AuthenticationType, IsAuthenticated и Name.
Мы можем определить имя текущего посетителя с помощью следующего кода:
Dim currentUsersName As String = User.Identity.Name
При использовании проверки подлинности форм объект FormsIdentity создается для свойства Identity GenericPrincipal. Класс FormsIdentity всегда возвращает строку "Forms" для свойства AuthenticationType и True для свойства IsAuthenticated. Свойство Name возвращает пользовательское имя, указанное при создании билета проверки подлинности с использованием форм. Помимо этих трех свойств, FormsIdentity включает доступ к базовому билету проверки подлинности через его свойство Ticket. Свойство Ticket возвращает объект типа FormsAuthenticationTicket, который имеет такие свойства, как Expiration, IsPersistent, IssueDate, Name и т. д.
Важно отметить, что параметр имя пользователя, указанный в методах FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie), и FormsAuthentication.RedirectFromLoginPage(username, persistCookie) — это то же значение, которое возвращается методом User.Identity.Name. Кроме того, билет аутентификации, созданный этими методами, доступен путем приведения User.Identity к объекту FormsIdentity и последующего доступа к свойству Ticket.
Dim ident As FormsIdentity = CType(User.Identity, FormsIdentity)
Dim authTicket As FormsAuthenticationTicket = ident.Ticket
Давайте предоставим более персонализированное сообщение в Default.aspx. Обновите обработчик событий Page_Load таким образом, чтобы свойству текстовой метки WelcomeBackMessage Text было присвоено строковое значение «С возвращением, имя пользователя!».
WelcomeBackMessage.Text = "Добро пожаловать обратно, " & User.Identity.Name & "!"
На рисунке 13 показан эффект этого изменения (при входе в систему от имени пользователя Scott).
Рис. 13. Приветственное сообщение содержит имя пользователя,вошедшего в систему (щелкните, чтобы просмотреть изображение полного размера)
Использование элементов управления LoginView и LoginName
Отображение другого содержимого для проверки подлинности и анонимных пользователей является общим требованием; поэтому отображается имя пользователя, вошедшего в систему. По этой причине ASP.NET включает два веб-элемента управления, которые предоставляют одинаковые функциональные возможности, показанные на рис. 13, но без необходимости писать одну строку кода.
Элемент управления LoginView — это веб-элемент управления на основе шаблона, который упрощает отображение различных данных для проверки подлинности и анонимных пользователей. LoginView включает два предопределенных шаблона:
- AnonymousTemplate — любая разметка, добавленная в этот шаблон, отображается только анонимным посетителям.
- LoggedInTemplate — разметка этого шаблона отображается только для пользователей, прошедших проверку подлинности.
Давайте добавим элемент управления LoginView на главную страницу сайта Site.master. Вместо того чтобы добавить только элемент управления LoginView, давайте добавим новый элемент управления ContentPlaceHolder, а затем поместим элемент управления LoginView в новый ContentPlaceHolder. Обоснование этого решения станет очевидным вскоре.
Замечание
Помимо AnonymousTemplate и LoggedInTemplate элемент управления LoginView может включать шаблоны, относящиеся к роли. Шаблоны, относящиеся к роли, отображают разметку только для тех пользователей, которые относятся к указанной роли. В будущем мы рассмотрим функции элемента управления LoginView на основе ролей.
Начните с добавления ContentPlaceHolder с именем LoginContent на главную страницу в элементе div< навигации>. Вы можете просто перетащить контрол ContentPlaceHolder из панели элементов в представление исходного кода, поместив результирующую разметку прямо над текстом "TODO: здесь будет меню".
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Затем добавьте элемент управления LoginView в объект LoginContent ContentPlaceHolder. Содержимое, помещенное в элементы управления ContentPlaceHolder главной страницы, считается контентом по умолчанию для ContentPlaceHolder. То есть ASP.NET страницы, использующие эту главную страницу, могут указать собственное содержимое для каждого ContentPlaceHolder или использовать содержимое по умолчанию главной страницы.
Элементы управления LoginView и другие элементы управления для входа находятся на вкладке "Вход" панели инструментов.
Рис. 14. Элемент управления LoginView в панели элементов (щелкните, чтобы просмотреть изображение полного размера)
Затем добавьте два элемента <br /> сразу после элемента управления LoginView, но по-прежнему в ContentPlaceHolder. На этом этапе разметка элемента навигации <div> должна выглядеть следующим образом:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Шаблоны LoginView можно определить из конструктора или декларативной разметки. В конструкторе Visual Studio разверните смарт-тег LoginView, в котором перечислены настроенные шаблоны в раскрывающемся списке. Введите текст "Привет, незнакомец" в AnonymousTemplate. Затем добавьте элемент управления HyperLink и задайте для свойств Text и NavigateUrl "Log In" и "~/Login.aspx" соответственно.
После настройки AnonymousTemplate переключитесь на logedInTemplate и введите текст "Добро пожаловать обратно". Затем перетащите элемент управления LoginName из панели элементов в объект LoggedInTemplate, поместив его сразу после текста приветствия. Элемент управления LoginName, как следует из его названия, отображает имя пользователя, вошедшего в систему. Внутри системы элемент управления LoginName просто выводит свойство User.Identity.Name
После добавления этих дополнений к шаблонам LoginView разметка должна выглядеть следующим образом:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back, <asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger. <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
В дополнение к главной странице Site.master каждая страница на нашем веб-сайте будет отображать другое сообщение в зависимости от того, прошел ли пользователь проверку подлинности. На рисунке 15 показана страница Default.aspx при посещении браузера пользователем Jisun. Сообщение "С возвращением, Jisun" повторяется дважды: один раз в навигационной секции главной страницы слева (с помощью элемента управления LoginView, который мы только что добавили) и один раз в контентной области Default.aspx (с помощью элементов управления Panel и программной логики).
Рис. 15. Элемент управления LoginView отображает сообщение: «С возвращением, Jisun». (Щелкните, чтобы просмотреть изображение полного размера)
Так как мы добавили LoginView на главную страницу, она может отображаться на каждой странице на нашем сайте. Однако могут быть веб-страницы, в которых мы не хотим показывать это сообщение. Одна из таких страниц — это страница входа, так как ссылка на нее кажется неуместной там. Поскольку элемент управления LoginView размещен в ContentPlaceHolder на главной странице, мы можем переопределить эту стандартную разметку на нашей странице содержимого. Откройте Login.aspx и перейдите в конструктор. Так как элемент управления содержимым не определен явным образом в Login.aspx для объекта LoginContent ContentPlaceHolder на главной странице, страница входа будет отображать разметку по умолчанию главной страницы для этого ContentPlaceHolder. Это можно увидеть с помощью конструктора— в файле LoginContent ContentPlaceHolder отображается разметка по умолчанию (элемент управления LoginView).
Рис. 16. Страница входа отображает содержимое по умолчанию для элемента LoginContent ContentPlaceHolder на главной странице (щелкните, чтобы просмотреть изображение полного размера)
Чтобы переопределить разметку по умолчанию для Объекта LoginContent ContentPlaceHolder, щелкните правой кнопкой мыши регион в конструкторе и выберите параметр "Создать настраиваемое содержимое" в контекстном меню. (При использовании Visual Studio 2008 ContentPlaceHolder содержит смарт-тег, который при выборе предлагает тот же параметр.) Это добавляет новый элемент управления контентом в разметку страницы и таким образом позволяет определить пользовательское содержимое для этой страницы. Вы можете добавить настраиваемое сообщение здесь, например войдите в систему, но давайте просто оставим это пустое.
Замечание
В Visual Studio 2005 создание настраиваемого содержимого создает пустой элемент управления содержимым на странице ASP.NET. Однако в Visual Studio 2008 создание настраиваемого содержимого копирует содержимое главной страницы по умолчанию в созданный элемент управления "Контент". Если вы используете Visual Studio 2008, то после создания нового элемента управления содержимым обязательно удалите содержимое, скопированное с главной страницы.
На рисунке 17 показана страница Login.aspx при посещении из браузера после внесения этого изменения. Обратите внимание, что в левой области навигации нет сообщений "Hello, незнакомец" или "С возвращением, username", как это есть при посещении Default.aspx.
Рис. 17. Страница входа скрывает разметку ContentPlaceHolder по умолчанию (щелкните, чтобы просмотреть изображение полного размера)
Шаг 5. Выход из системы
На шаге 3 мы рассмотрели создание страницы входа для входа пользователя на сайт, но мы еще не узнали, как выходить из системы. Помимо методов ведения журнала пользователя, класс FormsAuthentication также предоставляет метод SignOut. Метод SignOut просто уничтожает билет аутентификации форм, тем самым осуществляя выход пользователя с сайта.
Предоставление ссылки для выхода — это такая распространенная функция, что ASP.NET включает элемент управления, специально предназначенный для выхода пользователя из системы. Элемент управления LoginStatus для отображения элемента управления Login LinkButton или Logout LinkButton в зависимости от того, прошел ли пользователь аутентификацию. Кнопка ссылки "Вход" отображается для анонимных пользователей, в то время как кнопка ссылки "Выход" отображается для пользователей, прошедших проверку подлинности. Текст для ссылок для входа и выхода можно настроить с помощью свойств LoginStatus и LogoutText.
Нажатие кнопки "Login LinkButton" вызывает повторную отправку данных, после чего осуществляется перенаправление на страницу входа. При нажатии элемента управления LinkButton с надписью Logout, элемент управления LoginStatus вызывает метод FormsAuthentication.SignOff, а затем перенаправляет пользователя на другую страницу. Страница, на которую перенаправляется пользователь, выйдя из системы, зависит от свойства LogoutAction, которое можно назначить одному из трех следующих значений:
- Обновление — значение по умолчанию; перенаправляет пользователя на страницу, на которые они только что посещали. Если страница, которую они только что посещали, не разрешает анонимным пользователям, модуль FormsAuthenticationModule автоматически перенаправит пользователя на страницу входа.
Вам может быть интересно, почему перенаправление выполняется здесь. Если пользователь хочет остаться на той же странице, почему требуется явное перенаправление? Причина заключается в том, что при нажатии кнопки Logoff LinkButton пользователь по-прежнему имеет запрос проверки подлинности форм в коллекции файлов cookie. Следовательно, запрос обратной передачи является аутентифицированным запросом. Элемент управления LoginStatus вызывает метод SignOut, но это происходит после проверки подлинности пользователя FormsAuthenticationModule. Таким образом, явное перенаправление приводит к повторному запросу страницы в браузере. К тому времени, когда браузер повторно запрашивает страницу, запрос проверки подлинности форм был удален, поэтому входящие запросы анонимны.
- Перенаправление — пользователь перенаправляется по URL-адресу, указанному свойством LoginStatus LogoutPageUrl.
- RedirectToLoginPage — пользователь перенаправляется на страницу входа.
Давайте добавим элемент управления LoginStatus на эталонную страницу и настроим его, чтобы использовать параметр "Перенаправление" для отправки пользователя на страницу, в которую отображается сообщение, подтверждающее, что они выошли из системы. Начните с создания страницы в корневом каталоге с именем Logout.aspx. Не забудьте связать эту страницу с главной страницей Site.master. Затем введите сообщение в разметке страницы, объясняя пользователю, что они выошли из системы.
Затем вернитесь на главную страницу Site.master и добавьте элемент управления LoginStatus под LoginView в LoginContent ContentPlaceHolder. Задайте свойству LogoutAction элемента управления LoginStatus значение Redirect и свойству LogoutPageUrl значение ~/Logout.aspx.
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back, <asp:LoginName ID="LoginName1" runat="server" />.
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger. <asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>
Так как LoginStatus находится за пределами элемента управления LoginView, он будет отображаться как для анонимных, так и для аутентифицированных пользователей, но это нормально, поскольку LoginStatus будет правильно отображать ссылку для входа или выхода. При добавлении элемента управления LoginStatus гиперссылка для входа в AnonymousTemplate становится избыточной, поэтому её следует удалить.
На рисунке 18 показан Default.aspx, когда его посещает Джисун. Обратите внимание, что в левом столбце отображается сообщение, Добро пожаловать обратно, Jisun, вместе со ссылкой для выхода из системы. Нажатие на элемент управления LinkButton выхода вызывает обратную передачу, выходит Джисун из системы, а затем перенаправляет ее на страницу Logout.aspx. Как показано на рисунке 19, к тому времени, когда Цзисун достигает Logout.aspx, она уже вышла из системы и поэтому является анонимной. Следовательно, в левом столбце отображается текст Добро пожаловать, незнакомец и ссылка на страницу входа.
Рис. 18. Default.aspx приветствует вас снова, Jisun, вместе с кнопкой выхода (Щелкните, чтобы посмотреть изображение в полном размере)
Рис. 19. Logout.aspx отображает сообщение 'Добро пожаловать, незнакомец' вместе с кнопкой входа (Нажмите, чтобы увидеть изображение в полном размере)
Замечание
Я призываю вас настроить страницу Logout.aspx, чтобы скрыть элемент ContentPlaceHolder LoginContent на основной странице, как мы сделали для Login.aspx на шаге 4. Причина заключается в том, что элемент управления Login LinkButton, отображаемый элементом управления LoginStatus (который находится под Hello, незнакомец) отправляет пользователя на страницу входа, передавая текущий URL-адрес в параметре ReturnUrl querystring. Вкратце, если пользователь, вышедший из системы, щелкнет по кнопке входа Login в LoginStatus, а затем выполнит вход, он будет перенаправлен обратно на Logout.aspx, что может легко запутать пользователя.
Сводка
В этом руководстве мы начали с изучения процесса проверки подлинности форм, а затем перешли к реализации этой проверки в приложении ASP.NET. Проверка подлинности форм осуществляется с помощью FormsAuthenticationModule, которая несет две обязанности: идентификация пользователей на основе запроса проверки подлинности форм и перенаправление несанкционированных пользователей на страницу входа.
Класс FormsAuthentication в .NET Framework включает методы для создания, проверки и удаления форм аутентификации. Свойство Request.IsAuthenticated и объект User предоставляют дополнительную программную поддержку для определения проверки подлинности запроса и сведений об удостоверении пользователя. Существуют также элементы управления LoginView, LoginStatus и LoginName, которые предоставляют разработчикам простой способ выполнения многих распространенных задач, связанных с процессом входа в систему, без необходимости написания кода. Мы рассмотрим эти и другие веб-элементы управления, связанные с именем входа, более подробно в будущих руководствах.
В этом руководстве представлен краткий обзор проверки подлинности форм. Мы не изучили разнообразные параметры конфигурации, не рассмотрели, как работают билеты аутентификации без файлов cookie, или как ASP.NET защищает содержимое билета аутентификации форм. Мы обсудим эти темы и многое другое в следующем руководстве.
Счастливое программирование!
Дальнейшее чтение
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- Изменения между безопасностью IIS6 и IIS7
- Элементы управления ASP.NET для входа в систему
- ASP.NET 2.0: Профессиональная безопасность, членство и управление ролями (ISBN: 978-0-7645-9698-8)
- Элемент <проверки подлинности>
- <Элемент Forms для проверки подлинности
Учебный видеоролик по темам, содержащимся в этом руководстве
Сведения о авторе
Скотт Митчелл, автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга — Sams Teach Yourself ASP.NET 2.0 за 24 часа. Со Скоттом можно связаться по mitchell@4guysfromrolla.com или через его блог на http://ScottOnWriting.NET.
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Ведущие рецензенты этого руководства включают Алицию Maziarz, Джона Суру и Терезу Мерфи. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4guysfromrolla.com.