Общие сведения о проверке подлинности с помощью форм (C#)An Overview of Forms Authentication (C#)

по Скотт Митчеллby Scott Mitchell

Скачать код или скачать PDFDownload Code or Download PDF

В этом учебнике мы будем переключаться от самого подведения к реализации. в частности, мы рассмотрим реализацию проверки подлинности с помощью форм.In this tutorial we will turn from mere discussion to implementation; in particular, we will look at implementing forms authentication. Веб-приложение, которое мы начнем в этом учебнике, будет продолжать создаваться в последующих руководствах, так как мы перейдем к членству и ролям с помощью простой проверки подлинности на основе форм.The web application we start constructing in this tutorial will continue to be built upon in subsequent tutorials, as we move from simple forms authentication to membership and roles.

Дополнительные сведения по этой теме см. в этом видео: использование проверки подлинности Basic Forms в ASP.NET.Please see this video for more information on this topic: Using Basic Forms Authentication in ASP.NET.

ВведениеIntroduction

В предыдущем учебнике мы обсуждали различные параметры проверки подлинности, авторизации и учетной записи пользователя, предоставляемые ASP.NET.In the preceding tutorial we discussed the various authentication, authorization, and user account options provided by ASP.NET. В этом учебнике мы будем переключаться от самого подведения к реализации. в частности, мы рассмотрим реализацию проверки подлинности с помощью форм.In this tutorial we will turn from mere discussion to implementation; in particular, we will look at implementing forms authentication. Веб-приложение, которое мы начнем в этом учебнике, будет продолжать создаваться в последующих руководствах, так как мы перейдем к членству и ролям с помощью простой проверки подлинности на основе форм.The web application we start constructing in this tutorial will continue to be built upon in subsequent tutorials, as we move from simple forms authentication to membership and roles.

Этот учебник начинается с подробного взгляда на рабочий процесс проверки подлинности на основе форм, на который мы затронули предыдущий учебник.This tutorial begins with an in-depth look at the forms authentication workflow, a topic we touched upon in the previous tutorial. После этого мы создадим веб-сайт ASP.NET, с помощью которого вы узнаете основные понятия проверки подлинности с помощью форм.Following that, we will create an ASP.NET website through which to demo the concepts of forms authentication. Далее мы настроим сайт на использование проверки подлинности с помощью форм, создадим простую страницу входа и посмотрим, как определить, прошел ли пользователь проверку подлинности, и, если да, имя пользователя, выполнившего вход.Next, we will configure the site to use forms authentication, create a simple login page, and see how to determine, in code, whether a user is authenticated and, if so, the username they logged in with.

Понимание рабочего процесса проверки подлинности с помощью форм, включение его в веб-приложение и создание страниц входа и выхода из системы — это все важнейшие шаги в создании приложения ASP.NET, которое поддерживает учетные записи пользователей и выполняет проверку подлинности пользователей через веб-страницу.Understanding the forms authentication workflow, enabling it in a web application, and creating the login and logoff pages are all vital steps in building an ASP.NET application that supports user accounts and authenticates users through a web page. Из-за этого и потому, что эти учебники посвящены друг другу, я бы рекомендовал вам работать с этим учебником полностью, прежде чем переходить к следующему, даже если у вас уже есть опыт настройки проверки подлинности с помощью форм в прошлых проектах.Because of this – and because these tutorials build upon one another - I would encourage you to work through this tutorial in full before moving on to the next one even if you already have had experience configuring forms authentication in past projects.

Основные сведения о рабочем процессе проверки подлинности на формахUnderstanding the Forms Authentication Workflow

Когда среда выполнения ASP.NET обрабатывает запрос ресурса ASP.NET, например страницы ASP.NET или веб-службы ASP.NET, запрос вызывает ряд событий в течение жизненного цикла.When the ASP.NET runtime processes a request for an ASP.NET resource, such as an ASP.NET page or ASP.NET Web service, the request raises a number of events during its lifecycle. Существуют события, возникающие в самом начале и в конце запроса, которые вызываются при проверке подлинности и авторизации запроса, возникновении события в случае необработанного исключения и т. д.There are events raised at the very beginning and very end of the request, ones raised when the request is being authenticated and authorized, an event raised in the case of an unhandled exception, and so forth. Полный список событий см. в статье события объекта HttpApplication.To see a complete listing of the events, refer to the HttpApplication object's events.

HTTP-модули — это управляемые классы, код которых выполняется в ответ на определенное событие в жизненном цикле запроса.HTTP Modules are managed classes whose code is executed in response to a particular event in the request lifecycle. ASP.NET поставляется с несколькими HTTP-модулями, которые выполняют базовые задачи в фоновом режиме.ASP.NET ships with a number of HTTP Modules that perform essential tasks behind the scenes. Два встроенных HTTP-модуля, которые особенно важны для нашего обсуждения:Two built-in HTTP Modules that are especially relevant to our discussion are:

  • FormsAuthenticationModule — проверяет подлинность пользователя, проверяя билет проверки подлинности форм, который обычно включается в коллекцию файлов cookie пользователя.FormsAuthenticationModule – authenticates the user by inspecting the forms authentication ticket, which is typically included in the user's cookies collection. Если билет проверки подлинности форм отсутствует, пользователь является анонимным.If no forms authentication ticket is present, the user is anonymous.
  • UrlAuthorizationModule — определяет, имеет ли текущий пользователь разрешение на доступ к запрошенному URL-адресу.UrlAuthorizationModule – determines whether or not the current user is authorized to access the requested URL. Этот модуль определяет полномочия путем консультации правил авторизации, указанных в файлах конфигурации приложения.This module determines the authority by consulting the authorization rules specified in the application's configuration files. ASP.NET также включает FileAuthorizationModule , определяющие полномочия путем консультации с запрошенными списками ACL файлов.ASP.NET also includes the FileAuthorizationModule that determines authority by consulting the requested file(s) ACLs.

FormsAuthenticationModule пытается проверить подлинность пользователя до выполнения UrlAuthorizationModuleFileAuthorizationModule).The FormsAuthenticationModule attempts to authenticate the user prior to the UrlAuthorizationModule (and FileAuthorizationModule) executing. Если пользователь, выполняющий запрос, не имеет прав доступа к запрошенному ресурсу, модуль авторизации завершает запрос и возвращает сообщение о неавторизованном состоянии HTTP 401 .If the user making the request is not authorized to access the requested resource, the authorization module terminates the request and returns an HTTP 401 Unauthorized status. В сценариях проверки подлинности Windows в браузере возвращается состояние HTTP 401.In Windows authentication scenarios, the HTTP 401 status is returned to the browser. Этот код состояния заставляет браузер запрашивать учетные данные у пользователя через модальное диалоговое окно.This status code causes the browser to prompt the user for their credentials via a modal dialog box. Однако при проверке подлинности с помощью форм неавторизованное состояние HTTP 401 никогда не отправляется браузеру, так как FormsAuthenticationModule обнаруживает это состояние и изменяет его для перенаправления пользователя на страницу входа (через состояние перенаправления HTTP 302 ).With forms authentication, however, the HTTP 401 Unauthorized status is never sent to the browser because the FormsAuthenticationModule detects this status and modifies it to redirect the user to the login page instead (via an HTTP 302 Redirect status).

Ответственность за страницу входа состоит в том, чтобы определить, действительны ли учетные данные пользователя, и, если да, создать билет проверки подлинности на формах и перенаправить пользователя на страницу, которую они пытались посетить.The login page's responsibility is to determine if the user's credentials are valid and, if so, to create a forms authentication ticket and redirect the user back to the page they were attempting to visit. Билет проверки подлинности включается в последующие запросы к страницам веб-сайта, которые FormsAuthenticationModule использует для идентификации пользователя.The authentication ticket is included in subsequent requests to the pages on the website, which the FormsAuthenticationModule uses to identify the user.

Рабочий процесс проверки подлинности с помощью форм

Рис. 1. Рабочий процесс проверки подлинности с помощью формFigure 1: The Forms Authentication Workflow

Запоминание билета проверки подлинности на каждом посещении страницыRemembering the Authentication Ticket Across Page Visits

После входа билет проверки подлинности форм должен быть отправлен обратно на веб-сервер при каждом запросе, чтобы пользователь оставался в системе при просмотре сайта.After logging in, the forms authentication ticket must be sent back to the web server on each request so that the user remains logged in as they browse the site. Обычно это достигается путем помещения билета проверки подлинности в коллекцию файлов cookie пользователя.This is typically accomplished by placing the authentication ticket in the user's cookies collection. Файлы cookie — это небольшие текстовые файлы, которые находятся на компьютере пользователя и передаются в ЗАГОЛОВКАх HTTP для каждого запроса на веб-сайт, создавший файл cookie.Cookies are small text files that reside on the user's computer and are transmitted in the HTTP headers on each request to the website that created the cookie. Таким образом, после создания билета проверки подлинности форм и сохранения его в файлах cookie браузера каждый последующий веб-узел отправляет билет проверки подлинности вместе с запросом, тем самым определяя пользователя.Therefore, once the forms authentication ticket has been created and stored in the browser's cookies, each subsequent visit to that site sends the authentication ticket along with the request, thereby identifying the user.

Одним из аспектов файлов cookie является их срок действия, то есть дата и время, когда браузер отклоняет файл cookie.One aspect of cookies is their expiration, which is the date and time at which the browser discards the cookie. После истечения срока действия файла cookie проверки подлинности форм пользователь больше не сможет пройти проверку подлинности и, следовательно, станет анонимным.When the forms authentication cookie expires, the user can no longer be authenticated and therefore become anonymous. Когда пользователь посещается из общедоступного терминала, скорее всего, он должен истечь срок действия билета проверки подлинности, когда они закрывают свой браузер.When a user is visiting from a public terminal, chances are they want their authentication ticket to expire when they close their browser. Однако при посещении из дома тот же пользователь может потребовать, чтобы билет проверки подлинности запомнился при перезапуске браузера, чтобы избежать необходимости повторного входа в систему при каждом посещении сайта.When visiting from home, however, that same user might want the authentication ticket to be remembered across browser restarts so that they do not have to re-log in each time they visit the site. Это решение часто делается пользователем в виде флажка "Запомнить меня" на странице входа.This decision is often made by the user in the form of a "Remember me" checkbox on the login page. На этапе 3 мы рассмотрим, как установить флажок "Запомнить мои данные" на странице входа.In Step 3 we will examine how to implement a "Remember me" checkbox in the login page. В следующем учебнике подробно рассматриваются параметры времени ожидания билета проверки подлинности.The following tutorial addresses the authentication ticket timeout settings in detail.

Note

Возможно, что агент пользователя, используемый для входа на веб-сайт, может не поддерживать файлы cookie.It is possible that the user agent used to log on to the website may not support cookies. В этом случае ASP.NET может использовать билеты проверки подлинности форм без файлов cookie.In such a case, ASP.NET can use cookieless forms authentication tickets. В этом режиме билет проверки подлинности кодируется в URL-адрес.In this mode, the authentication ticket is encoded into the URL. Мы рассмотрим, когда используются билеты проверки подлинности без поддержки файлов cookie и как они создаются и управляются в следующем руководстве.We will look at when cookieless authentication tickets are used and how they are created and managed in the next tutorial.

Область проверки подлинности с помощью формThe Scope of Forms Authentication

FormsAuthenticationModule является управляемым кодом, который является частью среды выполнения ASP.NET.The FormsAuthenticationModule is managed code that is part of the ASP.NET runtime. До версии 7 веб-сервера Microsoft службы IIS (IIS) существует отдельный барьер между КОНВЕЙЕРОМ HTTP IIS и конвейером среды выполнения ASP.NET.Prior to version 7 of Microsoft's Internet Information Services (IIS) web server, there was a distinct barrier between IIS's HTTP pipeline and the ASP.NET runtime's pipeline. Вкратце, в IIS 6 и более ранних версиях FormsAuthenticationModule выполняется только при делегировании запроса из IIS в среду выполнения ASP.NET.In short, in IIS 6 and earlier, the FormsAuthenticationModule only executes when a request is delegated from IIS to the ASP.NET runtime. По умолчанию IIS обрабатывает статическое содержимое сами по себе, например HTML-страницы, CSS и файлы изображений, и передает запросы в среду выполнения ASP.NET только при запросе страницы с расширением. aspx,. asmx или. ashx.By default, IIS processes static content itself – like HTML pages and CSS and image files – and only hands off requests to the ASP.NET runtime when a page with an extension of .aspx, .asmx, or .ashx is requested.

Однако IIS 7 позволяет выполнять интегрированные конвейеры IIS и ASP.NET.IIS 7, however, allows for integrated IIS and ASP.NET pipelines. С помощью нескольких параметров конфигурации можно настроить IIS 7 для вызова FormsAuthenticationModule для всех запросов.With a few configuration settings you can setup IIS 7 to invoke the FormsAuthenticationModule for all requests. Более того, с помощью IIS 7 можно определить правила авторизации URL-адресов для файлов любого типа.Furthermore, with IIS 7 you can define URL authorization rules for files of any type. Дополнительные сведения см. в статьях изменения между IIS6 и IIS7, безопасность веб-платформыи Общие сведения об авторизации URL-адресов IIS7.For more information, see Changes Between IIS6 and IIS7 Security, Your Web Platform Security, and Understanding IIS7 URL Authorization.

Короткая история, в версиях до IIS 7, для защиты ресурсов, обрабатываемых средой выполнения ASP.NET, можно использовать только проверку подлинности с помощью форм.Long story short, in versions prior to IIS 7, you can only use forms authentication to protect resources handled by the ASP.NET runtime. Аналогичным образом правила авторизации URL-адресов применяются только к ресурсам, обрабатываемым средой выполнения ASP.NET.Likewise, URL authorization rules are only applied to resources handled by the ASP.NET runtime. Но в IIS 7 можно интегрировать FormsAuthenticationModule и Урлаусоризатионмодуле в конвейер HTTP IIS, тем самым расширяя эту функциональность на все запросы.But with IIS 7 it is possible to integrate the FormsAuthenticationModule and UrlAuthorizationModule into IIS's HTTP pipeline, thereby extending this functionality to all requests.

Шаг 1. Создание веб-сайта ASP.NET для этой серии руководствStep 1: Creating an ASP.NET Website for this Tutorial Series

Чтобы достичь самой широкой аудитории, веб-сайт ASP.NET, который мы будем создавать в этой серии, будет создан с помощью бесплатной версии Visual Studio 2008, Visual Web Developer 2008.In order to reach the widest possible audience, the ASP.NET website we will be building throughout this series will be created with Microsoft's free version of Visual Studio 2008, Visual Web Developer 2008. В базе данных Microsoft SQL Server 2005 Express Edition будет реализовано хранилище пользователей SqlMembershipProvider.We will implement the SqlMembershipProvider user store in a Microsoft SQL Server 2005 Express Edition database. Если вы используете Visual Studio 2005 или другой выпуск Visual Studio 2008 или SQL Server, не беспокойтесь — шаги будут практически идентичны, и на них будут выдаваться нетривиальные различия.If you are using Visual Studio 2005 or a different edition of Visual Studio 2008 or SQL Server, don't worry - the steps will be nearly identical and any non-trivial differences will be pointed out.

Note

Демонстрационное веб-приложение, используемое в каждом учебнике, доступно для загрузки.The demo web application used in each tutorial is available as a download. Это загружаемое приложение было создано с помощью Visual Web Developer 2008, предназначенного для .NET Framework версии 3,5.This downloadable application was created with Visual Web Developer 2008 targeted for the .NET Framework version 3.5. Так как приложение предназначено для .NET 3,5, его файл Web. config содержит дополнительные элементы конфигурации, относящиеся к 3,5.Since the application is targeted for .NET 3.5, its Web.config file includes additional, 3.5-specific configuration elements. Короткая история. Если вы еще не установили .NET 3,5 на компьютере, загружаемое веб-приложение не будет работать без предварительного удаления разметки, относящейся к 3,5, из файла Web. config.Long story short, if you have yet to install .NET 3.5 on your computer then the downloadable web application will not work without first removing the 3.5-specific markup from Web.config.

Прежде чем можно будет настроить проверку подлинности с помощью форм, сначала требуется веб-сайт ASP.NET.Before we can configure forms authentication, we first need an ASP.NET website. Начните с создания нового веб-сайта ASP.NET на основе файловой системы.Start by creating a new file system-based ASP.NET website. Для этого запустите Visual Web Developer, а затем перейдите в меню файл и выберите пункт Создать веб-сайт, в котором отображается диалоговое окно Новый веб-сайт.To accomplish this, launch Visual Web Developer and then go to the File menu and choose New Web Site, displaying the New Web Site dialog box. Выберите шаблон веб-сайт ASP.NET, в раскрывающемся списке Расположение выберите Файловая система, укажите папку для размещения веб-сайта и задайте для C#параметра язык значение.Choose the ASP.NET Web Site template, set the Location drop-down list to File System, choose a folder to place the web site, and set the language to C#. При этом будет создан новый веб-сайт со страницей Default. aspx ASP.NET, папка данных приложения_и файл Web. config.This will create a new web site with a Default.aspx ASP.NET page, an App_Data folder, and a Web.config file.

Note

Visual Studio поддерживает два режима управления проектами: проекты веб-сайтов и проекты веб-приложений.Visual Studio supports two modes of project management: Web Site Projects and Web Application Projects. В проектах веб-сайтов отсутствует файл проекта, тогда как проекты веб-приложений имитирует архитектуру проекта в Visual Studio .NET 2002/2003 — они включают файл проекта и компилируются исходный код проекта в одну сборку, которая помещается в папку "переводится".Web Site Projects lack a project file, whereas Web Application Projects mimic the project architecture in Visual Studio .NET 2002/2003 – they include a project file and compile the project's source code into a single assembly, which is placed in the /bin folder. В Visual Studio 2005 изначально поддерживаются только проекты веб-сайтов, хотя модель проекта веб-приложения была повторно введена с пакетом обновления 1 (SP1). Visual Studio 2008 предлагает обе модели проекта.Visual Studio 2005 initially only supported Web Site Projects, although the Web Application Project model was reintroduced with Service Pack 1; Visual Studio 2008 offers both project models. Однако выпуски Visual Web Developer 2005 и 2008 поддерживают только проекты веб-сайтов.The Visual Web Developer 2005 and 2008 editions, however, only support Web Site Projects. Я буду использовать модель проекта веб-сайта.I will be using the Web Site Project model. Если вы используете не Express Edition и хотите использовать модель проекта веб-приложения , вы можете сделать это, но имейте в виду, что на экране могут возникнуть некоторые несоответствия, а также действия, которые необходимо выполнить, а также инструкции, приведенные в этих учебниках.If you are using a non-Express edition and want to use the Web Application Project model instead, feel free to do so but be aware that there may be some discrepancies between what you see on your screen and the steps you must take versus the screen shots shown and instructions provided in these tutorials.

создать новый веб-сайт на основе файловой системыCreate a New File System-Based Web Site

Рис. 2. Создание нового веб-сайта на основе файловой системы (щелкните, чтобы просмотреть изображение с полным размером)Figure 2: Create a New File System-Based Web Site (Click to view full-size image)

Добавление главной страницыAdding a Master Page

Затем добавьте новую главную страницу к сайту в корневом каталоге с именем site. master.Next, add a new Master Page to the site in the root directory named Site.master. Главные страницы позволяют разработчику страницы определить шаблон на уровне сайта, который можно применить к страницам ASP.NET.Master pages enable a page developer to define a site-wide template that can be applied to ASP.NET pages. Основным преимуществом главных страниц является то, что общий внешний вид узла можно определить в одном месте, что упрощает обновление или настройку макета сайта.The main benefit of master pages is that the site's overall appearance can be defined in a single location, thereby making it easy to update or tweak the site's layout.

добавить главную страницу с именем site. master на веб-сайтAdd a Master Page Named Site.master to the Website

Рис. 3. Добавление главной страницы с именем site. master на веб-сайт (щелкните, чтобы просмотреть изображение с полным размером)Figure 3: Add a Master Page Named Site.master to the Website (Click to view full-size image)

Определите макет страницы для всего сайта на главной странице.Define the site-wide page layout here in the master page. Вы можете использовать представление конструирования и добавлять необходимые макеты или веб-элементы управления, или вручную добавить разметку в представлении источника.You can use the Design view and add whatever Layout or Web controls you need, or you can manually add the markup by hand in the Source view. Макет главной страницы был структурирован так, чтобы имитировать макет, используемый при работе с данными в руководстве по ASP.NET 2,0 (см. рис. 4).I structured my master page's layout to mimic the layout used in my Working with Data in ASP.NET 2.0 tutorial series (see Figure 4). Главная страница использует каскадные таблицы стилей для позиционирования и стилей с параметрами CSS, определенными в файле style. CSS (который входит в состав этого руководства).The master page uses cascading style sheets for positioning and styles with the CSS settings defined in the file Style.css (which is included in this tutorial's associated download). Хотя вы не можете отличить приведенную ниже разметку, правила CSS определяются таким образом, что элемент навигации <div>содержимым абсолютно позиционирован, чтобы он отображался слева и имеет фиксированную ширину 200 пикселей.While you cannot tell from the markup shown below, the CSS rules are defined such that the navigation <div>'s content is absolutely positioned so that it appears on the left and has a fixed width of 200 pixels.

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="Site.master.cs" 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, использующих главную страницу.A master page defines both the static page layout and the regions that can be edited by the ASP.NET pages that use the master page. Эти изменяемые регионы обозначаются элементом управления ContentPlaceHolder, который можно увидеть в содержимом <div>.These content editable regions are indicated by the ContentPlaceHolder control, which can be seen within the content <div>. Главная страница имеет один ContentPlaceHolder (MainContent), но на главной странице может быть несколько элементов управления ContentPlaceHolder.Our master page has a single ContentPlaceHolder (MainContent), but master page's may have multiple ContentPlaceHolders.

После того, как была указана разметка, переход на представление конструирования отображает макет главной страницы.With the markup entered above, switching to the Design view shows the master page's layout. Все страницы ASP.NET, использующие эту эталонную страницу, будут иметь такой единообразный макет с возможностью указать разметку для MainContent региона.Any ASP.NET pages that use this master page will have this uniform layout, with the ability to specify the markup for the MainContent region.

главную страницу при просмотре в режиме конструктораThe Master Page, When Viewed Through the Design View

Рис. 4. Главная страница при просмотре в режиме конструктора (щелкните, чтобы просмотреть изображение с полным размером)Figure 4: The Master Page, When Viewed Through the Design View (Click to view full-size image)

Создание страниц содержимогоCreating Content Pages

На этом этапе у нас есть страница Default. aspx на нашем веб-сайте, но она не использует только что созданную главную страницу.At this point we have a Default.aspx page in our website, but it does not use the master page we just created. Хотя можно управлять декларативной разметкой веб-страницы для использования главной страницы, если страница не содержит содержимого, проще просто удалить страницу и снова добавить ее в проект, указав главную страницу для использования.While it is possible to manipulate the declarative markup of a web page to use a master page, if the page doesn't contain any content yet it is easier to just delete the page and re-add it to the project, specifying the master page to use. Поэтому начните с удаления Default. aspx из проекта.Therefore, start by deleting Default.aspx from the project.

Затем щелкните правой кнопкой мыши имя проекта в обозреватель решений и выберите Добавить новую веб-форму с именем Default. aspx.Next, right-click on the project name in the Solution Explorer and choose to add a new Web Form named Default.aspx. На этот раз установите флажок "выбрать главную страницу" и выберите в списке главную страницу site. master.This time, check the "Select master page" checkbox and choose the Site.master master page from the list.

добавить новую страницу Default. aspx, выбранную для выбора главной страницыAdd a New Default.aspx Page Choosing to Select a Master Page

Рис. 5. Добавление новой страницы Default. aspx выбор главной страницы (щелкните, чтобы просмотреть изображение с полным размером)Figure 5: Add a New Default.aspx Page Choosing to Select a Master Page (Click to view full-size image)

Использование главной страницы Site. master

Рис. 6. Использование главной страницы Site. masterFigure 6: Use the Site.master Master Page

Note

При использовании модели проекта веб-приложения диалоговое окно Добавление нового элемента не включает флажок "выбрать главную страницу".If you are using the Web Application Project Model the Add New Item dialog box does not include a "Select master page" checkbox. Вместо этого необходимо добавить элемент типа "форма веб-содержимого".Instead, you need to add an item of type "Web Content Form." Выбрав параметр "форма веб-содержимого" и нажав кнопку Добавить, Visual Studio отобразит то же диалоговое окно Выбор мастера, показанное на рис. 6.After choosing the "Web Content Form" option and clicking Add, Visual Studio will display the same Select a Master dialog box shown in Figure 6.

Новая декларативная разметка страницы Default. aspx включает только директиву @Page, указывающую путь к файлу главной страницы и элемент управления содержимым для MainContent ContentPlaceHolder главной страницы.The new Default.aspx page's declarative markup includes just a @Page directive specifying the path to the master page file and a Content control for the master page's MainContent ContentPlaceHolder.

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
</asp:Content>

Пока оставьте пустым Default. aspx.For now, leave Default.aspx empty. Далее в этом руководстве мы вернемся к нему, чтобы добавить содержимое.We will return to it later in this tutorial to add content.

Note

Главная страница содержит раздел для меню или другой интерфейс навигации.Our master page includes a section for a menu or some other navigation interface. В следующем учебном курсе мы создадим такой интерфейс.We will create such an interface in a future tutorial.

Шаг 2. Включение проверки подлинности с помощью формStep 2: Enabling Forms Authentication

После создания веб-сайта ASP.NET необходимо включить проверку подлинности с помощью форм.With the ASP.NET website created, our next task is to enable forms authentication. Конфигурация проверки подлинности приложения задается с помощью элемента<authentication> в файле Web. config. Элемент <authentication> содержит единственный атрибут с именем mode, указывающий модель проверки подлинности, используемую приложением.The application's authentication configuration is specified through the <authentication> element in Web.config. The <authentication> element contains a single attribute named mode that specifies the authentication model used by the application. Этот атрибут может иметь одно из следующих четырех значений:This attribute can have one of the following four values:

  • Windows . как обсуждалось в предыдущем учебнике, когда приложение использует проверку подлинности Windows, веб-сервер отвечает за проверку подлинности посетителя, и обычно выполняется с помощью обычной, дайджестовой или встроенной проверки подлинности Windows.Windows – as discussed in the preceding tutorial, when an application uses Windows authentication it is the web server's responsibility to authenticate the visitor, and this is usually done through Basic, Digest, or Integrated Windows authentication.
  • Формы— пользователи проходят проверку подлинности через форму на веб-странице.Forms– users are authenticated via a form on a web page.
  • Passport— пользователи проходят проверку подлинности с помощью сети Microsoft Passport Network.Passport– users are authenticated using Microsoft's Passport Network.
  • Нет— модель проверки подлинности не используется; Все посетители являются анонимными.None– no authentication model is used; all visitors are anonymous.

По умолчанию приложения ASP.NET используют проверку подлинности Windows.By default, ASP.NET applications use Windows authentication. Чтобы изменить тип проверки подлинности на проверку подлинности с помощью форм, необходимо изменить атрибут mode элемента <authentication> на Forms.To change the authentication type to forms authentication, then, we need to modify the <authentication> element's mode attribute to Forms.

Если проект еще не содержит файл Web. config, добавьте его сейчас, щелкнув правой кнопкой мыши имя проекта в обозреватель решений, выбрав пункт Добавить новый элемент, а затем добавив файл веб-конфигурации.If your project does not yet contain a Web.config file, add one now by right-clicking on the project name in the Solution Explorer, choosing Add New Item, and then adding a Web Configuration file.

, если проект еще не содержит файл Web. config, добавьте его сейчасIf Your Project Does Not Yet Include Web.config, Add It Now

Рис. 7. Если проект еще не содержит файл Web. config, добавьте его сейчас (щелкните, чтобы просмотреть изображение с полным размером)Figure 7: If Your Project Does Not Yet Include Web.config, Add It Now (Click to view full-size image)

Затем выберите элемент <authentication> и обновите его, чтобы использовать проверку подлинности с помощью форм.Next, locate the <authentication> element and update it to use forms authentication. После этого изменения разметка файла Web. config должна выглядеть следующим образом:After this change, your Web.config file's markup should look similar to the following:

<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>

Note

Так как файл Web. config является XML-файлом, важен регистр.Since Web.config is an XML file, casing is important. Убедитесь, что для атрибута mode задано значение Forms с заглавной буквой «F».Make sure that you set the mode attribute to Forms, with a capital "F". Если используется другой регистр, например "Forms", при посещении сайта через браузер возникнет ошибка конфигурации.If you use a different casing, such as "forms", you'll receive a configuration error when visiting the site through a browser.

Элемент <authentication> может дополнительно включать <forms> дочерний элемент, содержащий параметры, относящиеся к проверке подлинности на основе форм.The <authentication> element may optionally include a <forms> child element that contains forms authentication-specific settings. Сейчас давайте просто используем параметры проверки подлинности форм по умолчанию.For now, let's just use the default forms authentication settings. В следующем руководстве мы рассмотрим более подробно дочерний элемент <forms>.We will explore the <forms> child element in more detail in the next tutorial.

Шаг 3. Создание страницы входаStep 3: Building the Login Page

Для поддержки проверки подлинности с помощью форм веб-сайту требуется страница входа.In order to support forms authentication our website needs a login page. Как обсуждалось в разделе «Основные сведения о рабочем процессе проверки подлинности с помощью форм», FormsAuthenticationModule автоматически перенаправит пользователя на страницу входа, если попытается получить доступ к странице, которую не разрешено просматривать.As discussed in the "Understanding the Forms Authentication Workflow" section, the FormsAuthenticationModule will automatically redirect the user to the login page if they attempt to access a page that they are not authorized to view. Есть также ASP.NET веб-элементы управления, которые будут отображать ссылку на страницу входа для анонимных пользователей.There are also ASP.NET Web controls that will display a link to the login page to anonymous users. Это возникает вопрос: «Каков URL-адрес страницы входа?».This begs the question, "What is the URL of the login page?"

По умолчанию система проверки подлинности форм ждет, что страница входа имеет имя Login. aspx и размещается в корневом каталоге веб-приложения.By default, the forms authentication system expects the login page to be named Login.aspx and placed in the root directory of the web application. Если вы хотите использовать другой URL-адрес страницы входа, это можно сделать, указав его в файле Web. config. В следующем руководстве мы посмотрим, как это сделать.If you want to use a different login page URL, you can do so by specifying it in Web.config. We will see how to do this in the subsequent tutorial.

Страница входа имеет три обязанности:The login page has three responsibilities:

  1. Предоставьте интерфейс, позволяющий посетителю вводить свои учетные данные.Provide an interface that allows the visitor to enter their credentials.
  2. Определите, являются ли отправленные учетные данные допустимыми.Determine if the submitted credentials are valid.
  3. «Войдите в систему пользователя, создав билет проверки подлинности с помощью форм."Log in" the user by creating the forms authentication ticket.

Создание пользовательского интерфейса страницы входаCreating the Login Page's User Interface

Давайте приступим к работе с первой задачей.Let's get started with the first task. Добавьте новую страницу ASP.NET в корневой каталог сайта с именем Login. aspx и свяжите ее с главной страницей site. master.Add a new ASP.NET page to the site's root directory named Login.aspx and associate it with the Site.master master page.

добавить новую страницу ASP.NET с именем Login. aspxAdd a New ASP.NET Page Named Login.aspx

Рис. 8. Добавление новой страницы ASP.NET с именем Login. aspx (щелкните, чтобы просмотреть изображение с полным размером)Figure 8: Add a New ASP.NET Page Named Login.aspx (Click to view full-size image)

Стандартный интерфейс страницы входа состоит из двух текстовых полей: одно для имени пользователя, одно для пароля и кнопку для отправки формы.The typical login page interface consists of two textboxes – one for the user's name, one for their password – and a button to submit the form. Веб-сайты часто содержат флажок "Запомнить меня", который, если отмечено, сохраняет итоговый билет проверки подлинности при перезапуске браузера.Websites oftentimes include a "Remember me" checkbox that, if checked, persists the resulting authentication ticket across browser restarts.

Добавьте два текстовых поля в login. aspx и задайте для их свойств ID имя пользователя и пароль соответственно.Add two TextBoxes to Login.aspx and set their ID properties to UserName and Password, respectively. Также задайте для свойства TextMode пароля значение Password.Also set Password's TextMode property to Password. Затем добавьте элемент управления CheckBox, задав для его свойства ID значение RememberMe, а для свойства Text — значение "Запомнить меня".Next, add a CheckBox control, setting its ID property to RememberMe and its Text property to "Remember Me". После этого добавьте кнопку с именем Логинбуттон, свойство Text которого имеет значение login.Following that, add a Button named LoginButton whose Text property is set to "Login". И, наконец, добавьте элемент управления Label и задайте для его свойства ID значение Инвалидкредентиалсмессаже, его Text свойству "имя пользователя или пароль являются недопустимыми.And finally, add a Label Web control and set its ID property to InvalidCredentialsMessage, its Text property to "Your username or password is invalid. Повторите попытку. ", его ForeColor свойству Red, а свойству Visible — значение false.Please try again.", its ForeColor property to Red, and its Visible property to False.

На этом этапе экран должен выглядеть аналогично снимку экрана на рис. 9, а декларативный синтаксис страницы должен выглядеть следующим образом:At this point your screen should look similar to the screen shot in Figure 9, and your page's declarative syntax should like the following:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" 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>

страница входа содержит два текстовых поля, флажок, кнопку и метку.The Login Page Contains Two TextBoxes, a CheckBox, a Button, and a Label

Рис. 9. страница входа содержит два текстовых поля, флажок, кнопку и метку (щелкните, чтобы просмотреть изображение с полным размером).Figure 9: The Login Page Contains Two TextBoxes, a CheckBox, a Button, and a Label (Click to view full-size image)

Наконец, создайте обработчик событий для события Click Логинбуттон.Finally, create an event handler for the LoginButton's Click event. В конструкторе просто дважды щелкните элемент управления "Кнопка", чтобы создать этот обработчик событий.From the Designer, simply double-click the Button control to create this event handler.

Определение допустимости предоставленных учетных данныхDetermining If the Supplied Credentials are Valid

Теперь нам нужно реализовать задачу 2 в обработчике событий нажатия кнопки — определить, являются ли предоставленные учетные данные допустимыми.We now need to implement task 2 in the Button's Click event handler – determining whether the supplied credentials are valid. Для этого необходимо, чтобы в хранилище пользователя содержались все учетные данные пользователей, чтобы можно было определить, совпадают ли предоставленные учетные данные с любыми известными учетными данными.In order to do this there needs to be a user store that holds all of the users' credentials so that we can determine if the supplied credentials match up with any known credentials.

До ASP.NET 2,0 разработчики отвечали за реализацию собственных хранилищ пользователей и написание кода для проверки предоставленных учетных данных в магазине.Prior to ASP.NET 2.0, developers were responsible for implementing both their own user stores and writing the code to validate the supplied credentials against the store. Большинство разработчиков реализуют хранилище пользователей в базе данных, создавая таблицу с именем Users с такими столбцами, как имя пользователя, пароль, электронная почта, LastLoginDate и т. д.Most developers would implement the user store in a database, creating a table named Users with columns like UserName, Password, Email, LastLoginDate, and so forth. Эта таблица, а затем, будет иметь одну запись для каждой учетной записи пользователя.This table, then, would have one record per user account. Проверка предоставленных учетных данных пользователя влечет за собой запрос соответствующего имени пользователя в базе данных, а затем гарантирует, что пароль в базе данных соответствует предоставленному паролю.Verifying a user's supplied credentials would involve querying the database for a matching username and then ensuring that the password in the database corresponded to the supplied password.

С помощью ASP.NET 2,0 разработчики должны использовать одного из поставщиков членства для управления хранилищем пользователей.With ASP.NET 2.0, developers should use one of the Membership providers to manage the user store. В этой серии руководств мы будем использовать SqlMembershipProvider, который использует базу данных SQL Server для хранилища пользователей.In this tutorial series we will be using the SqlMembershipProvider, which uses a SQL Server database for the user store. При использовании SqlMembershipProvider необходимо реализовать определенную схему базы данных, включающую таблицы, представления и хранимые процедуры, ожидаемые поставщиком.When using the SqlMembershipProvider we need to implement a specific database schema that includes the tables, views, and stored procedures expected by the provider. Мы рассмотрим, как реализовать эту схему в руководстве Создание схемы членства в SQL Server .We will examine how to implement this schema in the Creating the Membership Schema in SQL Server tutorial. При наличии поставщика членства проверка учетных данных пользователя выполняется так же просто, как вызов метода ValidateUser класса членства (имя пользователя, пароль), который возвращает логическое значение, указывающее, действительно ли введено сочетание имени пользователя и пароля .With the Membership provider in place, validating the user's credentials is as simple as calling the Membership class's ValidateUser(username, password) method, which returns a Boolean value indicating whether the validity of the username and password combination. Пока мы еще не реализовали хранилище пользователей SqlMembershipProvider, в настоящее время невозможно использовать метод ValidateUser класса Membership.Seeing as we have not yet implemented the SqlMembershipProvider's user store, we cannot use the Membership class's ValidateUser method at this time.

Вместо того, чтобы создавать собственную таблицу пользовательской базы данных Users (которая будет устаревшей после реализации SqlMembershipProvider), давайте жестко зададим действительные учетные данные на странице входа в систему.Rather than take the time to build our own custom Users database table (which would be obsolete once we implemented the SqlMembershipProvider), let's instead hard-code the valid credentials within the login page itself. В обработчике событий Click для Логинбуттон добавьте следующий код:In the LoginButton's Click event handler, add the following code:

protected void LoginButton_Click(object sender, EventArgs e)
{
    // Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
    string[] users = { "Scott", "Jisun", "Sam" };
    string[] passwords = { "password", "password", "password" };
    for (int i = 0; i < users.Length; i++)
    {
        bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
        bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
        if (validUsername && validPassword)
        {
            // TODO: Log in the user...
            // TODO: Redirect them to the appropriate page
        }
    }
    // If we reach here, the user's credentials were invalid
    InvalidCredentialsMessage.Visible = true;
}

Как видите, есть три действительных учетных записи: Скотт, Цзисунь и SAM — и все три имеют одинаковый пароль ("пароль").As you can see, there are three valid user accounts – Scott, Jisun, and Sam – and all three have the same password ("password"). Код просматривает массивы пользователей и паролей для поиска допустимого имени пользователя и пароля.The code loops through the users and passwords arrays looking for a valid username and password match. Если имя пользователя и пароль действительны, необходимо выполнить вход пользователя и перенаправить их на соответствующую страницу.If both the username and password are valid, we need to login the user and then redirect them to the appropriate page. Если учетные данные недопустимы, отобразится метка Инвалидкредентиалсмессаже.If the credentials are invalid, then we display the InvalidCredentialsMessage Label.

Когда пользователь вводит действительные учетные данные, я упомянул, что они перенаправляются на соответствующую страницу.When a user enters valid credentials, I mentioned that they are then redirected to the "appropriate page." Что же такое страница?What is the appropriate page, though? Помните, что когда пользователь посещает страницу, которой не разрешено просматривать, FormsAuthenticationModule автоматически перенаправляет их на страницу входа.Recall that when a user visits a page they are not authorized to view, the FormsAuthenticationModule automatically redirects them to the login page. При этом он включает запрошенный URL-адрес в строку запроса через параметр ReturnUrl.In doing so, it includes the requested URL in the querystring via the ReturnUrl parameter. Это значит, что если пользователь пытался посетить Протектедпаже. aspx и ему не было предоставлено разрешение, FormsAuthenticationModule перенаправит их в:That is, if a user attempted to visit ProtectedPage.aspx, and they were not authorized to do so, the FormsAuthenticationModule would redirect them to:

Login. aspx? ReturnUrl = Протектедпаже. aspxLogin.aspx?ReturnUrl=ProtectedPage.aspx

После успешного входа пользователь должен быть перенаправлен обратно в Протектедпаже. aspx.Upon successfully logging in, the user should be redirected back to ProtectedPage.aspx. Кроме того, пользователи могут посетить страницу входа на свой собственный желанию.Alternatively, users may visit the login page on their own volition. В этом случае после входа в систему пользователь должен отправить на страницу Default. aspx корневой папки.In that case, after logging in the user they should be sent to the root folder's Default.aspx page.

Вход пользователя в системуLogging In the User

Предполагая, что предоставленные учетные данные действительны, необходимо создать билет проверки подлинности на формах, что ведет к входу пользователя на сайт.Assuming that the supplied credentials are valid, we need to create a forms authentication ticket, thereby logging in the user to the site. Класс FormsAuthentication в пространстве имен System. Web. Security предоставляет различные методы для входа и входа пользователей с помощью системы проверки подлинности форм.The FormsAuthentication class in the System.Web.Security namespace provides assorted methods for logging in and logging out users via the forms authentication system. Хотя в классе FormsAuthentication существует несколько методов, три нас заинтересованы в этом присоединении к:While there are several methods in the FormsAuthentication class, the three we are interested in at this juncture are:

  • Жетаускукие (username, персисткукие) — создает билет проверки подлинности на основе форм для заданного имени пользователя.GetAuthCookie(username, persistCookie) – creates a forms authentication ticket for the supplied name username. Затем этот метод создает и возвращает объект HttpCookie, содержащий содержимое билета проверки подлинности.Next, this method creates and returns an HttpCookie object that holds the contents of the authentication ticket. Если персисткукие имеет значение true, создается постоянный файл cookie.If persistCookie is true, a persistent cookie is created.
  • Сетаускукие (username, персисткукие) — вызывает метод жетаускукие (username, персисткукие) для создания файла cookie проверки подлинности на основе форм.SetAuthCookie(username, persistCookie) – calls the GetAuthCookie(username, persistCookie) method to generate the forms authentication cookie. Затем этот метод добавляет файл cookie, возвращенный Жетаускукие, в коллекцию Cookies (предполагается, что используется проверка подлинности с помощью форм на основе файлов cookie). в противном случае этот метод вызывает внутренний класс, обрабатывающий логику билета без файлов cookie.This method then adds the cookie returned by GetAuthCookie to the Cookies collection (assuming cookies-based forms authentication is being used; otherwise, this method calls an internal class that handles the cookieless ticket logic).
  • RedirectFromLoginPage (username, персисткукие) — этот метод вызывает сетаускукие (username, персисткукие), а затем перенаправляет пользователя на соответствующую страницу.RedirectFromLoginPage(username, persistCookie) – this method calls SetAuthCookie(username, persistCookie), and then redirects the user to the appropriate page.

Жетаускукие удобен, когда необходимо изменить билет проверки подлинности перед записью файлов cookie в коллекцию Cookies.GetAuthCookie is handy when you need to modify the authentication ticket before writing the cookie out to the Cookies collection. Сетаускукие полезен, если вы хотите создать билет проверки подлинности с помощью форм и добавить его в коллекцию Cookies, но не хотите перенаправлять пользователя на соответствующую страницу.SetAuthCookie is useful if you want to create the forms authentication ticket and add it to the Cookies collection, but do not want to redirect the user to the appropriate page. Возможно, вы хотите, чтобы они оставались на странице входа или отправлялись на другую страницу.Perhaps you want to keep them on the login page or send them to some alternate page.

Так как мы хотим войти в систему пользователя и перенаправлены на соответствующую страницу, давайте будем использовать RedirectFromLoginPage.Since we want to log in the user and redirect them to the appropriate page, let's use RedirectFromLoginPage. Обновите обработчик событий Click для Логинбуттон, заменив две строки TODO с комментариями следующей строкой кода:Update the LoginButton's Click event handler, replacing the two commented TODO lines with the following line of code:

FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);

При создании билета проверки подлинности с помощью форм мы используем свойство Text текстового поля UserName для параметра имени пользователя билета проверки подлинности Forms и состояние Checked флажка rememberMe для параметра персисткукие .When creating the forms authentication ticket we use the UserName TextBox's Text property for the forms authentication ticket username parameter, and the checked state of the RememberMe CheckBox for the persistCookie parameter.

Чтобы протестировать страницу входа, откройте ее в браузере.To test the login page, visit it in a browser. Начните с ввода недопустимых учетных данных, например имени пользователя "нет" и пароля "неправильный".Start by entering invalid credentials, such as a username of "Nope" and a password of "wrong". При нажатии кнопки входа произойдет обратная передача, и будет отображена метка Инвалидкредентиалсмессаже.Upon clicking the Login button a postback will occur and the InvalidCredentialsMessage Label will be displayed.

при вводе недопустимых учетных данных отображается метка ИнвалидкредентиалсмессажеThe InvalidCredentialsMessage Label is Displayed When Entering Invalid Credentials

Рис. 10. метка Инвалидкредентиалсмессаже отображается при вводе недопустимых учетных данных (щелкните, чтобы просмотреть изображение с полным размером)Figure 10: The InvalidCredentialsMessage Label is Displayed When Entering Invalid Credentials (Click to view full-size image)

Затем введите допустимые учетные данные и нажмите кнопку Login (вход).Next, enter valid credentials and click the Login button. На этот раз, когда происходит обратная передача, создается билет проверки подлинности форм, и вы автоматически перенаправляете обратно в Default. aspx.This time when the postback occurs a forms authentication ticket is created and you are automatically redirected back to Default.aspx. На этом этапе вы выполнили вход на веб-сайт, хотя нет визуальных подсказок, указывающих на то, что вы выполнили вход в систему.At this point you have logged in to the website, although there are no visual cues to indicate that you are currently logged in. На шаге 4 мы посмотрим, как программным образом определить, вошел ли пользователь в систему или нет, а также как определить пользователя, который посещает страницу.In Step 4 we will see how to programmatically determine whether a user is logged in or not as well as how to identify the user visiting the page.

На шаге 5 рассматриваются методы входа пользователя из веб-сайта в журнал.Step 5 examines techniques for logging a user out of the website.

Защита страницы входаSecuring the Login Page

Когда пользователь вводит свои учетные данные и отправляет форму страницы входа, учетные данные (включая пароль) передаются через Интернет на веб-сервер в виде обычного текста.When the user enters her credentials and submits the login page form, the credentials – including her password – are transmitted over the Internet to the web server in plain text. Это означает, что любой злоумышленник, прослушивать сетевой трафик, может видеть имя пользователя и пароль.That means any hacker sniffing the network traffic can see the username and password. Чтобы избежать этого, важно зашифровать сетевой трафик с помощью SSL.To prevent this, it is essential to encrypt the network traffic by using Secure Socket Layers (SSL). Это гарантирует, что учетные данные (а также все HTML-разметка страницы) будут зашифрованы с момента выхода из браузера, пока они не будут получены веб-сервером.This will ensure that the credentials (as well as the entire page's HTML markup) are encrypted from the moment they leave the browser until they are received by the web server.

Если веб-сайт не содержит конфиденциальные сведения, необходимо использовать протокол SSL только на странице входа и на других страницах, где пароль пользователя в противном случае будет отправлен по сети в виде обычного текста.Unless your website contains sensitive information, you will only need to use SSL on the login page and on other pages where the user's password would otherwise be sent over the wire in plain text. Не нужно беспокоиться о защите билета проверки подлинности с помощью форм, так как по умолчанию он шифруется и подписывается с цифровой подписью (для предотвращения незаконного изменения).You do not need to worry about securing the forms authentication ticket since, by default, it is both encrypted and digitally signed (to prevent tampering). В следующем учебнике представлено более подробное обсуждение безопасности билета проверки подлинности с помощью форм.A more thorough discussion on forms authentication ticket security is presented in the following tutorial.

Note

Многие финансовые и медицинские веб-сайты настроены на использование SSL на всех страницах, доступных для пользователей, прошедших проверку подлинности.Many financial and medical websites are configured to use SSL on all pages accessible to authenticated users. При создании такого веб-сайта можно настроить систему проверки подлинности форм таким образом, чтобы билет проверки подлинности форм передавался только через безопасное соединение.If you are building such a website you can configure the forms authentication system so that the forms authentication ticket is only transmitted over a secure connection. В следующем руководстве рассматриваются различные варианты настройки проверки подлинности форм, Конфигурация проверки подлинности с помощью форм и дополнительные разделы .We will look at the various forms authentication configuration options in the next tutorial, Forms Authentication Configuration and Advanced Topics.

Шаг 4. Обнаружение прошедших проверку подлинности посетителей и определение их удостоверенияStep 4: Detecting Authenticated Visitors and Determining Their Identity

На этом этапе мы включили проверку подлинности с помощью форм и создали элементарную страницу входа, но нам еще не нужно изучать, как можно определить, прошел ли пользователь проверку подлинности или анонимность.At this point we have enabled forms authentication and created a rudimentary login page, but we have yet to examine how we can determine whether a user is authenticated or anonymous. В некоторых сценариях может потребоваться отображение различных данных или сведений в зависимости от того, посещается ли на странице Проверка подлинности или анонимный пользователь.In certain scenarios we may wish to display different data or information depending on whether an authenticated or anonymous user is visiting the page. Более того, мы часто должны знать удостоверение пользователя, прошедшего проверку подлинности.Moreover, we oftentimes need to know the identity of the authenticated user.

Добавим существующую страницу Default. aspx, чтобы продемонстрировать эти приемы.Let's augment the existing Default.aspx page to illustrate these techniques. В Default. aspx добавьте два элемента управления Panel: один с именем Аусентикатедмессажепанел и другой с именем Анонимаусмессажепанел.In Default.aspx add two Panel controls, one named AuthenticatedMessagePanel and another named AnonymousMessagePanel. Добавьте элемент управления Label с именем Велкомебаккмессаже на первой панели.Add a Label control named WelcomeBackMessage in the first Panel. На второй панели добавьте элемент управления HyperLink, задайте для его свойства Text значение "вход" и свойство NavigateUrl в значение "~/Логин.аспкс".In the second Panel add a HyperLink control, set its Text property to "Log In" and its NavigateUrl property to "~/Login.aspx". На этом этапе декларативная разметка для Default. aspx должна выглядеть следующим образом:At this point the declarative markup for Default.aspx should look similar to the following:

<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" 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>

Как вы, вероятно, выдумали сейчас, идея заключается в том, чтобы отобразить только Аусентикатедмессажепанел для посетителей, прошедших проверку подлинности, и только Анонимаусмессажепанел анонимных посетителей.As you have probably guessed by now, the idea here is to display just the AuthenticatedMessagePanel to authenticated visitors and just the AnonymousMessagePanel to anonymous visitors. Для этого необходимо установить видимые свойства этих панелей в зависимости от того, вошел ли пользователь в систему или нет.To accomplish this we need to set these Panels' Visible properties depending on whether the user is logged in or not.

Свойство request. Authenticator возвращает логическое значение, указывающее, прошел ли запрос проверку подлинности.The Request.IsAuthenticated property returns a Boolean value indicating whether the request has been authenticated. Введите следующий код в страницу_загрузить код обработчика событий:Enter the following code into the Page_Load event handler code:

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.IsAuthenticated)
    {
        WelcomeBackMessage.Text = "Welcome back!";
    
        AuthenticatedMessagePanel.Visible = true;
        AnonymousMessagePanel.Visible = false;
    }
    else
    {
        AuthenticatedMessagePanel.Visible = false;
        AnonymousMessagePanel.Visible = true;
    }
}

Используя этот код, откройте страницу Default. aspx через браузер.With this code in place, visit Default.aspx through a browser. Если вы еще не выполнили вход, вы увидите ссылку на страницу входа (см. рис. 11).Assuming that you have yet to log in, you will see a link to the login page (see Figure 11). Щелкните эту ссылку и войдите на сайт.Click this link and log in to the site. Как было показано на шаге 3, после ввода учетных данных вы вернетесь к Default. aspx, но на этот раз на странице отобразится ответ "Добро пожаловать!".As we saw in Step 3, after entering your credentials you will be returned to Default.aspx, but this time the page shows the "Welcome back!" сообщение (см. рис. 12).message (see Figure 12).

При анонимном посещении отображается ссылка для входа

Рис. 11. при анонимном посещении отображается ссылка для входаFigure 11: When Visiting Anonymously, a Log In Link is Displayed

Пользователи, прошедшие проверку подлинности, отображаются

Рис. 12. Пользователи, прошедшие проверку подлинности, показывают "Добро пожаловать!"Figure 12: Authenticated Users are Shown the "Welcome back!" СообщениеMessage

Мы можем определить удостоверение текущего пользователя, вошедшего в систему, с помощью Свойства пользователя объекта HttpContext.We can determine the currently logged on user's identity via the HttpContext object's User property. Объект HttpContext представляет сведения о текущем запросе, а также является доменом для таких распространенных объектов ASP.NET, как ответ, запрос и сеанс, и т. д.The HttpContext object represents information about the current request, and is the home for such common ASP.NET objects as Response, Request, and Session, among others. Свойство User представляет контекст безопасности текущего HTTP-запроса и реализует интерфейс IPrincipal.The User property represents the security context of the current HTTP request and implements the IPrincipal interface.

Свойство User задается параметром FormsAuthenticationModule.The User property is set by the FormsAuthenticationModule. В частности, когда FormsAuthenticationModule находит билет проверки подлинности форм во входящем запросе, он создает новый объект GenericPrincipal и назначает его свойству User.Specifically, when the FormsAuthenticationModule finds a forms authentication ticket in the incoming request, it creates a new GenericPrincipal object and assigns it to the User property.

Объекты Principal (например, GenericPrincipal) предоставляют сведения об удостоверении пользователя и ролях, к которым они принадлежат.Principal objects (like GenericPrincipal) provide information on the user's identity and the roles to which they belong. Интерфейс IPrincipal определяет два члена:The IPrincipal interface defines two members:

Имя текущего посетителя можно определить с помощью следующего кода:We can determine the name of the current visitor using the following code:

String Куррентусерснаме = User.Identity.Name;string currentUsersName = User.Identity.Name;

При использовании проверки подлинности с помощью форм для свойства Identity GenericPrincipal создается объект FormsIdentity .When using forms authentication, a FormsIdentity object is created for the GenericPrincipal's Identity property. Класс FormsIdentity всегда возвращает строку Forms для своего свойства AuthenticationType и значение true для свойства, прошедшего проверку подлинности.The FormsIdentity class always returns the string "Forms" for its AuthenticationType property and true for its IsAuthenticated property. Свойство Name возвращает имя пользователя, указанное при создании билета проверки подлинности с помощью форм.The Name property returns the username specified when creating the forms authentication ticket. Помимо этих трех свойств, FormsIdentity включает доступ к базовому билету проверки подлинности через свойство Ticket.In addition to these three properties, FormsIdentity includes access to the underlying authentication ticket via its Ticket property. Свойство Ticket возвращает объект типа формсаусентикатионтиккет, который имеет такие свойства, как Expires, Иссуедате, Name и т. д.The Ticket property returns an object of type FormsAuthenticationTicket, which has properties like Expiration, IsPersistent, IssueDate, Name, and so on.

Важно отметить, что параметр username , указанный в методах FormsAuthentication. жетаускукие (имя_пользователя, Персисткукие), FormsAuthentication.Сетаускукие (username, персисткукие) и FormsAuthentication. RedirectFromLoginPage (username, персисткукие), совпадает со значением, возвращенным User.Identity.Name.The important point to take away here is that the username parameter specified in the FormsAuthentication.GetAuthCookie(username, persistCookie), FormsAuthentication.SetAuthCookie(username, persistCookie), and FormsAuthentication.RedirectFromLoginPage(username, persistCookie) methods is the same value returned by User.Identity.Name. Более того, билет проверки подлинности, созданный этими методами, доступен путем приведения пользователя. Identity к объекту FormsIdentity и получения доступа к свойству Ticket:Moreover, the authentication ticket created by these methods is available by casting User.Identity to a FormsIdentity object and then accessing the Ticket property:

FormsIdentity ident = User.Identity as FormsIdentity;
FormsAuthenticationTicket authTicket = ident.Ticket;

Давайте предоставляющим более персонализированное сообщение в Default. aspx.Let's provide a more personalized message in Default.aspx. Обновите обработчик событий страницы_загрузки, чтобы свойству Text метки Велкомебаккмессаже было присвоено строковое значение "Добро пожаловать, username!".Update the Page_Load event handler so that the WelcomeBackMessage Label's Text property is assigned the string "Welcome back, username!"

Велкомебаккмессаже. Text = "Добро пожаловать," + User.Identity.Name + "!";WelcomeBackMessage.Text = "Welcome back, " + User.Identity.Name + "!";

На рис. 13 показан результат этого изменения (при входе в систему от имени пользователя Скотта).Figure 13 shows the effect of this modification (when logging in as user Scott).

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

Рис. 13. Приветственное сообщение содержит имя текущего пользователя, выполнившего входFigure 13: The Welcome Message Includes the Currently Logged In User's Name

Использование элементов управления LoginView и LoginNameUsing the LoginView and LoginName Controls

При отображении другого содержимого для проверки подлинности и анонимных пользователей используется общее требование. Таким образом отображается имя пользователя, выполнившего вход в систему.Displaying different content to authenticated and anonymous users is a common requirement; so is displaying the name of the currently logged on user. По этой причине ASP.NET включает два веб-элемента управления, которые предоставляют те же функциональные возможности, что показаны на рис. 13, но без необходимости написания одной строки кода.For that reason, ASP.NET includes two Web controls that provide the same functionality shown in Figure 13, but without the need to write a single line of code.

Элемент управления LoginView — это веб-элемент управления, основанный на шаблоне, который упрощает отображение различных данных для проверки подлинности и анонимных пользователей.The LoginView control is a template-based Web control that makes it easy to display different data to authenticated and anonymous users. В LoginView есть два предопределенных шаблона:The LoginView includes two predefined templates:

  • Анонимаустемплате — любая разметка, добавленная в этот шаблон, отображается только для анонимных посетителей.AnonymousTemplate – any markup added to this template is only displayed to anonymous visitors.
  • Логжединтемплате — разметка этого шаблона отображается только для пользователей, прошедших проверку подлинности.LoggedInTemplate – this template's markup is shown only to authenticated users.

Добавим элемент управления LoginView на главную страницу сайта site. master.Let's add the LoginView control to our site's master page, Site.master. Однако вместо добавления только элемента управления LoginView добавим новый элемент управления ContentPlaceHolder, а затем поместим элемент управления LoginView в новом элементе ContentPlaceHolder.Rather than adding just the LoginView control, though, let's add both a new ContentPlaceHolder control and then put the LoginView control within that new ContentPlaceHolder. Это решение станет очевидным в ближайшее время.The rationale for this decision will become apparent shortly.

Note

Помимо Анонимаустемплате и Логжединтемплате, элемент управления LoginView может включать в себя шаблоны для конкретных ролей.In addition to the AnonymousTemplate and LoggedInTemplate, the LoginView control can include role-specific templates. Зависящие от роли шаблоны отображают разметку только тем пользователям, которые принадлежат к указанной роли.Role-specific templates show markup only to those users that belong to a specified role. В следующем учебном курсе мы рассмотрим возможности элемента управления LoginView на основе ролей.We will examine the role-based features of the LoginView control in a future tutorial.

Начните с добавления элемента ContentPlaceHolder с именем Логинконтент в главную страницу в элементе навигации <div>.Start by adding a ContentPlaceHolder named LoginContent into the master page within the navigation <div> element. Можно просто перетащить элемент управления ContentPlaceHolder с панели элементов в представление исходного кода, поместив полученную разметку прямо над меню TODO:... полнотекстовым.You can simply drag a ContentPlaceHolder control from the Toolbox onto the Source view, placing the resulting markup right above the "TODO: Menu will go here…" text.

<div id="navigation">
    <asp:ContentPlaceHolder ID="LoginContent" runat="server">
    </asp:ContentPlaceHolder>
   
    TODO: Menu will go here...
</div>

Затем добавьте элемент управления LoginView в Логинконтент ContentPlaceHolder.Next, add a LoginView control within the LoginContent ContentPlaceHolder. Содержимое, помещенное в элементы управления ContentPlaceHolder главной страницы, считается содержимым по умолчанию для ContentPlaceHolder.Content placed into the master page's ContentPlaceHolder controls are considered default content for the ContentPlaceHolder. То есть страницы ASP.NET, использующие эту эталонную страницу, могут указывать собственное содержимое для каждого ContentPlaceHolder или использовать содержимое по умолчанию главной страницы.That is, ASP.NET pages that use this master page can specify their own content for each ContentPlaceHolder or use the master page's default content.

Средства LoginView и другие элементы управления, связанные с именем входа, находятся на вкладке Имя входа на панели элементов.The LoginView and other login-related controls are located in the Toolbox's Login tab.

Элемент управления LoginView на панели элементов

Рис. 14. элемент управления LoginView на панели элементовFigure 14: The LoginView Control in the Toolbox

Затем добавьте два элемента <BR/> сразу после элемента управления LoginView, но по-прежнему в ContentPlaceHolder.Next, add two <br /> elements immediately after the LoginView control, but still within the ContentPlaceHolder. На этом этапе разметка навигации <div> элемента должна выглядеть следующим образом:At this point, the navigation <div> element's markup should look like the following:

<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 можно определить из конструктора или декларативной разметки.The LoginView's templates can be defined from the Designer or the declarative markup. В конструкторе Visual Studio разверните смарт-тег LoginView, в котором перечислены настроенные шаблоны в раскрывающемся списке.From Visual Studio's Designer, expand the LoginView's smart tag, which lists the configured templates in a drop-down list. Введите текст "Hello, Стрэнджер" в Анонимаустемплате; Затем добавьте элемент управления HyperLink и задайте для его свойств Text и NavigateUrl значение "вход" и "~/Логин.аспкс" соответственно.Type in the text "Hello, stranger" into the AnonymousTemplate; next, add a HyperLink control and set its Text and NavigateUrl properties to "Log In" and "~/Login.aspx", respectively.

После настройки Анонимаустемплате переключитесь на Логжединтемплате и введите текст «Добро пожаловать».After configuring the AnonymousTemplate, switch to the LoggedInTemplate and enter the text, "Welcome back, ". Затем перетащите элемент управления LoginName с панели инструментов в Логжединтемплате, поместив его сразу после текста «Добро пожаловать».Then drag a LoginName control from the Toolbox into the LoggedInTemplate, placing it immediately after the "Welcome back, " text. Элемент управления LoginName, как и предполагает его имя, отображает имя пользователя, выполнившего вход в систему.The LoginName control, as its name implies, displays the name of the currently logged in user. На внутреннем уровне элемент управления LoginName просто выводит свойство User.Identity.NameInternally, the LoginName control simply outputs the User.Identity.Name property

После внесения этих дополнений в шаблоны LoginView разметка должна выглядеть следующим образом:After making these additions to the LoginView's templates, the markup should look similar to the following:

<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 на каждой странице веб-сайта будет отображаться другое сообщение в зависимости от того, прошел ли пользователь проверку подлинности.With this addition to the Site.master master page, each page in our website will display a different message depending on whether the user is authenticated. На рис. 15 показана страница Default. aspx при посещении через браузер пользователем Цзисунь.Figure 15 shows the Default.aspx page when visited through a browser by user Jisun. Сообщение "Добро пожаловать, Цзисунь" повторяется дважды: один раз в разделе навигации главной страницы слева (через элемент управления LoginView, который мы только что добавили) и один раз в области содержимого Default. aspx (с помощью элементов управления Panel и программной логики).The "Welcome back, Jisun" message is repeated twice: once in the master page's navigation section on the left (via the LoginView control we just added) and once in the Default.aspx's content area (via Panel controls and programmatic logic).

Элемент управления LoginView отображает

Рис. 15. элемент управления LoginView отображает «Добро пожаловать, цзисунь».Figure 15: The LoginView Control Displays "Welcome back, Jisun."

Так как мы добавили объект LoginView на главную страницу, он может отображаться на каждой странице сайта.Because we added the LoginView to the master page, it can appear in every page on our site. Однако могут существовать веб-страницы, на которых не нужно выводить это сообщение.However, there may be web pages where we don't want to show this message. Одной из таких страниц является страница входа в систему, так как ссылка на страницу входа кажется на месте.One such page is the login page, since a link to the login page seems out of place there. Так как мы поместили элемент управления LoginView в ContentPlaceHolder на главной странице, мы можем переопределить эту разметку по умолчанию на странице содержимого.Since we placed the LoginView control in a ContentPlaceHolder in the master page, we can override this default markup in our content page. Откройте Login. aspx и перейдите в конструктор.Open Login.aspx and go to the Designer. Так как мы не создали явно элемент управления содержимым в файле Login. aspx для Логинконтент ContentPlaceHolder на главной странице, на странице входа будет показана разметка по умолчанию для этой страницы ContentPlaceHolder на главной странице.Since we have not explicitly defined a Content control in Login.aspx for the LoginContent ContentPlaceHolder in the master page, the login page will show the master page's default markup for this ContentPlaceHolder. Это можно увидеть с помощью конструктора — Логинконтент ContentPlaceHolder показывает разметку по умолчанию (элемент управления LoginView).You can see this through the Designer – the LoginContent ContentPlaceHolder shows the default markup (the LoginView control).

странице входа отображается содержимое по умолчанию для Логинконтент ContentPlaceHolder главной страницы.The Login Page Shows the Default Content for the Master Page's LoginContent ContentPlaceHolder

Рис. 16. на странице входа отображается содержимое по умолчанию для Логинконтент ContentPlaceHolder главной страницы (щелкните, чтобы просмотреть изображение с полным размером)Figure 16: The Login Page Shows the Default Content for the Master Page's LoginContent ContentPlaceHolder (Click to view full-size image)

Чтобы переопределить разметку по умолчанию для элемента ContentPlaceHolder Логинконтент, просто щелкните правой кнопкой мыши область в конструкторе и выберите в контекстном меню пункт Создать настраиваемое содержимое.To override the default markup for the LoginContent ContentPlaceHolder, simply right-click on the region in the Designer and choose the Create Custom Content option from the context menu. (При использовании Visual Studio 2008 ContentPlaceHolder включает смарт-тег, который при выборе имеет тот же параметр.) Это добавляет новый элемент управления содержимым к разметке страницы и тем самым позволяет нам определить пользовательское содержимое для этой страницы.(When using Visual Studio 2008 the ContentPlaceHolder includes a smart tag that, when selected, offers the same option.) This adds a new Content control to the page's markup and thereby allows us to define custom content for this page. Можно добавить пользовательское сообщение, например "Войдите в систему...", но просто оставьте это поле пустым.You could add a custom message here, such as "Please log in…", but let's just leave this blank.

Note

При создании пользовательского содержимого в Visual Studio 2005 на странице ASP.NET создается пустой элемент управления содержимым.In Visual Studio 2005, creating custom content creates an empty Content control in the ASP.NET page. Однако в Visual Studio 2008 Создание пользовательского содержимого копирует содержимое по умолчанию главной страницы в только что созданный элемент управления содержимым.In Visual Studio 2008, however, creating custom content copies the master page's default content into the newly created Content control. Если вы используете Visual Studio 2008, то после создания нового элемента управления содержимым убедитесь, что содержимое, скопированное с главной страницы, было очищено.If you are using Visual Studio 2008, then, after creating the new Content control make sure to clear out the content copied over from the master page.

На рис. 17 показана страница Login. aspx при посещении из браузера после внесения этого изменения.Figure 17 shows the Login.aspx page when visited from a browser after making this change. Обратите внимание, что в левой области навигации <div нет сообщения "Привет, Стрэнджер" или "Добро пожаловать, имя_пользователя"> как при посещении Default. aspx.Note that there is no "Hello, stranger" or "Welcome back, username" message in the left navigation <div> as there is when visiting Default.aspx.

страница входа скрывает разметку ContentPlaceHolder Логинконтент по умолчаниюThe Login Page Hides the Default LoginContent ContentPlaceHolder's Markup

Рис. 17. страница входа скрывает разметку Логинконтент ContentPlaceHolder по умолчанию (щелкните, чтобы просмотреть изображение с полным размером)Figure 17: The Login Page Hides the Default LoginContent ContentPlaceHolder's Markup (Click to view full-size image)

Шаг 5. выход из сеансаStep 5: Logging Out

На этапе 3 мы рассматривали создание страницы входа для входа пользователя на сайт, но мы еще не видели, как выполнить вход пользователя в систему. В дополнение к методам входа пользователя в класс FormsAuthentication также предоставляет метод выхода.In Step 3 we looked at building a login page to log a user in to the site, but we have yet to see how to log a user out. In addition to methods for logging a user in, the FormsAuthentication class also provides a SignOut method. Метод выхода просто уничтожает билет проверки подлинности форм, тем самым выписывая пользователя из сайта.The SignOut method simply destroys the forms authentication ticket, thereby logging the user out of the site.

Предложение выхода из системы — это общая функция, которая ASP.NET включает элемент управления, специально предназначенный для входа пользователя в систему. Элемент управления LoginStatus отображает LinkButton "Login" или "Logout" в зависимости от состояния проверки подлинности пользователя.Offering a log out link is such a common feature that ASP.NET includes a control specifically designed to log a user out. The LoginStatus control displays either a "Login" LinkButton or a "Logout" LinkButton, depending on the user's authentication status. Отображается «login» LinkButton для анонимных пользователей, тогда как элемент LinkButton «Logout» отображается для пользователей, прошедших проверку подлинности.A "Login" LinkButton is rendered for anonymous users, whereas a "Logout" LinkButton is displayed to authenticated users. Текст для элемента LinkButton "Login" и "Logout" можно настроить с помощью свойств LoginStatus Логинтекст и Логауттекст.The text for the "Login" and "Logout" LinkButtons can be configured via the LoginStatus's LoginText and LogoutText properties.

При нажатии LinkButton "Login" вызывается обратная передача, из которой перенаправление выдается странице входа.Clicking the "Login" LinkButton causes a postback, from which a redirect is issued to the login page. Если щелкнуть LinkButton "Logout", элемент управления LoginStatus вызовет метод FormsAuthentication., а затем перенаправляет пользователя на страницу.Clicking the "Logout" LinkButton causes the LoginStatus control to invoke the FormsAuthentication.SignOff method and then redirects the user to a page. Страница, с которой выполнен выход из системы, зависит от свойства Логаутактион, которое может быть назначено одному из следующих трех значений:The page the logged off user is redirected to depends on the LogoutAction property, which can be assigned to one of the three following values:

  • Обновить — по умолчанию; перенаправляет пользователя на страницу, которая была только что посещена.Refresh – the default; redirects the user to the page they were just visiting. Если страница, которая была только что посещена, не допускает анонимных пользователей, FormsAuthenticationModule автоматически перенаправит пользователя на страницу входа.If the page they were just visiting does not allow anonymous users, then the FormsAuthenticationModule will automatically redirect the user to the login page.

Возможно, вам интересно, почему выполняется перенаправление.You may be curious as to why a redirect is performed here. Если пользователь хочет остаться на той же странице, зачем нужно явно перенаправление?If the user wants to remain on the same page, why the need for the explicit redirect? Причина заключается в том, что при нажатии на элемент LinkButton "logoff" пользователь по-прежнему имеет билет проверки подлинности форм в своей коллекции файлов cookie.The reason is because when the "Logoff" LinkButton is clicked, the user still has the forms authentication ticket in their cookies collection. Следовательно, запрос на обратную передачу является запросом, прошедшим проверку подлинности.Consequently, the postback request is an authenticated request. Элемент управления LoginStatus вызывает метод Sign, но это происходит после того, как FormsAuthenticationModule проходил проверку подлинности пользователя.The LoginStatus control calls the SignOut method, but that happens after the FormsAuthenticationModule has authenticated the user. Таким образом, явное перенаправление заставляет браузер повторно запрашивать страницу.Therefore, an explicit redirect causes the browser to re-request the page. К моменту, когда браузер повторно запрашивает страницу, билет проверки подлинности на основе форм был удален, поэтому входящий запрос анонимен.By the time the browser re-requests the page, the forms authentication ticket has been removed and therefore the incoming request is anonymous.

  • Redirect — пользователь перенаправляется по URL-адресу, указанному в свойстве Логаутпажеурл LoginStatus.Redirect – the user is redirected to the URL specified by the LoginStatus's LogoutPageUrl property.
  • Редиректтологинпаже — пользователь перенаправляется на страницу входа.RedirectToLoginPage – the user is redirected to the login page.

Давайте добавим элемент управления LoginStatus на главную страницу и настроим его на использование параметра перенаправления, чтобы отправить пользователю на страницу, на которой отображается сообщение о том, что оно выйдет из системы. Начните с создания страницы в корневом каталоге с именем Logout. aspx.Let's add a LoginStatus control to the master page and configure it to use the Redirect option to send the user to a page that displays a message confirming that they have been signed out. Start by creating a page in the root directory named Logout.aspx. Не забудьте связать эту страницу с главной страницей site. master.Don't forget to associate this page with the Site.master master page. Затем введите сообщение в разметке страницы, объясняющее пользователя, что он вышел из нее.Next, enter a message in the page's markup explaining to the user that they have been logged out.

Затем вернитесь на главную страницу site. master и добавьте элемент управления LoginStatus под узлом LoginView в Логинконтент ContentPlaceHolder.Next, return to the Site.master master page and add a LoginStatus control beneath the LoginView in the LoginContent ContentPlaceHolder. Задайте для свойства Логаутактион элемента управления LoginStatus значение Redirect и его свойство Логаутпажеурл значение "~/логаут.аспкс".Set the LoginStatus control's LogoutAction property to Redirect and its LogoutPageUrl property to "~/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 будет правильно отображать элемент управления LinkButton "Login" или "Logout".Since the LoginStatus is outside of the LoginView control, it will appear for both anonymous and authenticated users, but that's OK because the LoginStatus will correctly display a "Login" or "Logout" LinkButton. С добавлением элемента управления LoginStatus гиперссылка для входа в Анонимаустемплате является избыточной, поэтому удалите ее.With the addition of the LoginStatus control, the "Log In" HyperLink in the AnonymousTemplate is superfluous, so remove it.

На рис. 18 показан Default. aspx при посещении Цзисунь.Figure 18 shows Default.aspx when Jisun visits. Обратите внимание, что в левом столбце отображается сообщение "Добро пожаловать, Цзисунь" и ссылка для выхода из нее. Если щелкнуть элемент LinkButton, выполнит обратную передачу, подписывает Цзисунь из системы, а затем перенаправит его в Logout. aspx.Note that the left column displays the message, "Welcome back, Jisun" along with a link to log out. Clicking the log out LinkButton causes a postback, signs Jisun out of the system, and then redirects her to Logout.aspx. Как показано на рис. 19, время, когда Цзисунь доходит до выхода. aspx, он уже выполнил выход и поэтому является анонимным.As Figure 19 shows, by the time Jisun reaches Logout.aspx she has already been signed out and is therefore anonymous. Следовательно, в левом столбце отображается текст "Добро пожаловать, Стрэнджер" и ссылка на страницу входа.Consequently, the left column shows the text "Welcome, stranger" and a link to the login page.

Default. aspx показываетDefault.aspx Shows

Рис. 18. Default. aspx показывает "Добро пожаловать, Цзисунь" вместе с LinkButton "Logout" (щелкните, чтобы просмотреть изображение с полным размером)Figure 18: Default.aspx Shows "Welcome Back, Jisun" Along with a "Logout" LinkButton (Click to view full-size image)

Logout. aspx показываетLogout.aspx Shows

Рис. 19. logout. aspx отображает "Welcome, Стрэнджер" вместе с "Login" LinkButton (щелкните, чтобы просмотреть изображение с полным размером)Figure 19: Logout.aspx Shows "Welcome, stranger" Along with a "Login" LinkButton (Click to view full-size image)

Note

Я рекомендую настроить страницу Logout. aspx, чтобы скрыть Логинконтент ContentPlaceHolder главной страницы (как мы делали это для Login. aspx на шаге 4).I encourage you to customize the Logout.aspx page to hide the master page's LoginContent ContentPlaceHolder (like we did for Login.aspx in Step 4). Причина заключается в том, что элемент управления LinkButton, отображаемый элементом LoginStatus (который находится под заголовком "Hello, Стрэнджер"), отправляет пользователю страницу входа, передающий текущий URL-адрес в параметре строки запроса ReturnUrl.The reason is because the "Login" LinkButton rendered by the LoginStatus control (the one beneath "Hello, stranger") sends the user to the login page passing the current URL in the ReturnUrl querystring parameter. Вкратце, если пользователь, который вышел из системы, щелкает элемент LinkButton "Login" (имя входа) LoginStatus, а затем входит в систему, он будет перенаправлен обратно в Logout. aspx, что может легко запутать пользователя.In short, if a user who has logged out clicks this LoginStatus's "Login" LinkButton, and then logs in, they will be redirected back to Logout.aspx, which could easily confuse the user.

СводкаSummary

В этом учебнике мы начали изучение рабочего процесса проверки подлинности с помощью форм, а затем включили проверку подлинности с помощью форм в приложении ASP.NET.In this tutorial we started with an examination of the forms authentication workflow and then turned to implementing forms authentication in an ASP.NET application. Проверка подлинности с помощью форм основана на FormsAuthenticationModule, которая имеет две обязанности: Определение пользователей на основе билета проверки подлинности форм и перенаправление неавторизованных пользователей на страницу входа.Forms authentication is powered by the FormsAuthenticationModule, which has two responsibilities: identifying users based on their forms authentication ticket, and redirecting unauthorized users to the login page.

Класс FormsAuthentication .NET Framework содержит методы для создания, проверки и удаления билетов проверки подлинности с помощью форм.The .NET Framework's FormsAuthentication class includes methods for creating, inspecting, and removing forms authentication tickets. Свойство Request. Authenticator и объект User предоставляют дополнительную программную поддержку для определения того, прошел ли запрос проверку подлинности и сведения об удостоверении пользователя.The Request.IsAuthenticated property and User object provide additional programmatic support for determining whether a request is authenticated and information about the user's identity. Существуют также веб-элементы управления LoginView, LoginStatus и LoginName, которые позволяют разработчикам быстро и без кода выполнять многие общие задачи, связанные с входом в систему.There are also the LoginView, LoginStatus, and LoginName Web controls, which give developers a quick, code-free way for performing many common login-related tasks. Эти и другие веб-элементы управления, связанные с входом в систему, подробно рассматриваются в следующих руководствах.We will examine these and other login-related Web controls in greater detail in future tutorials.

В этом руководстве предоставлены общие сведения о проверке подлинности с помощью форм.This tutorial provided a cursory overview of forms authentication. Мы не проверили параметры конфигурации ассортимента, посмотрим, как работают билеты проверки подлинности с помощью форм без файлов cookie, или Познакомьтесь с тем, как ASP.NET защищает содержимое билета проверки подлинности с помощью форм.We did not examine the assorted configuration options, look at how cookieless forms authentication tickets work, or explore how ASP.NET protects the contents of the forms authentication ticket. В следующем учебникемы рассмотрим эти и другие темы.We will discuss these topics and more in the next tutorial.

Поздравляем с программированием!Happy Programming!

Дополнительные материалыFurther Reading

Дополнительные сведения о разделах, обсуждаемых в этом руководстве, см. в следующих ресурсах:For more information on the topics discussed in this tutorial, refer to the following resources:

Видеообучение по темам, содержащимся в этом руководствеVideo Training on Topics Contained in this Tutorial

Об автореAbout the Author

Скотт Митчелл, автор семи книг по ASP/ASP. NET и основатель 4GuysFromRolla.com, работал с веб-технологиями Майкрософт с 1998.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Скотт работает как независимый консультант, преподаватель и модуль записи.Scott works as an independent consultant, trainer, and writer. Его последняя книга — Sams обучать себя ASP.NET 2,0 за 24 часа.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Он доступен по адресу mitchell@4GuysFromRolla.com.He can be reached at mitchell@4GuysFromRolla.com. или через его блог, который можно найти по адресу http://ScottOnWriting.NET.or via his blog, which can be found at http://ScottOnWriting.NET.

Особая благодарность...Special Thanks To…

Эта серия руководств была рассмотрена многими полезными рецензентами.This tutorial series was reviewed by many helpful reviewers. В ходе работы с этим руководством мы рассматривали все полезные рецензенты.Lead reviewer for this tutorial was This tutorial series was reviewed by many helpful reviewers. Потенциальные рецензенты для этого руководства включают в себя Аликжа Мазиарз, Джон суру и Терезой Мерфи.Lead reviewers for this tutorial include Alicja Maziarz, John Suru, and Teresa Murphy. Хотите ознакомиться с моими будущими статьями MSDN?Interested in reviewing my upcoming MSDN articles? Если это так, расположите строку в mitchell@4GuysFromRolla.com.If so, drop me a line at mitchell@4GuysFromRolla.com.