Практическое руководство. Реализация простой проверки подлинности с помощью форм
Обновлен: Ноябрь 2007
В примере, изложенном в данном разделе, показана простая реализация проверки подлинности с помощью форм ASP.NET. Это сделано для того, чтобы показать принципы использования проверки подлинности с помощью форм для входа пользователей в приложение ASP.NET.
Примечание. |
---|
Удобным способом проверки подлинности с помощью форм является использование членства ASP.NET и элементов управления входа ASP.NET. Членство ASP.NET предоставляет способ хранения и управления сведениями о пользователе, а также содержит методы проверки подлинности пользователей. Элементы управления входом ASP.NET работают с членством ASP.NET и инкапсулируют логику для запроса учетных данных пользователей, проверяют подлинность пользователя, восстанавливают или изменяют пароли и т. д. Фактически членство ASP.NET и элементы управления входом ASP.NET обеспечивают уровень абстракции проверки подлинности с помощью форм и заменяют большую часть работы или всю работу, которая обычно выполняется, чтобы использовать проверку подлинности с помощью форм. Дополнительные сведения см. в разделах Управление пользователями путем объединения их в группы и Общие сведения об элементах управления входом ASP.NET. |
Например, в сценарии пользователи запрашивают защищенный ресурс, а именно страницу Default.aspx. Только один пользователь получает доступ к защищенному ресурсу: jchen@contoso.com, с паролем «37Yj*99P». Имя и пароль пользователя жестко заданы в файле Logon.aspx. Для примера требуется наличие трех файлов: файла Web.config, страниц Logon.aspx и Default.aspx. Файлы постоянно хранятся в корневой папке приложения.
Настройка приложения для проверки подлинности с помощью форм
Если в корне приложения имеется файл Web.config, откройте его.
Если в корневой папке приложения отсутствует файл Web.config, то создайте текстовый файл под названием Web.config и добавьте в него следующие элементы:
<?xml version="1.0"?> <configuration xmlns="https://schemas.microsoft.com/.NetConfiguration/v2.0"> <system.web> </system.web> </configuration>
Создайте в элементе system.web элемент authentication и присвойте его атрибуту mode значение Forms, как показано в следующем примере:
<system.web> <authentication mode="Forms"> </authentication> </system.web>
В элементе authentication создайте элемент forms и задайте следующие атрибуты:
Атрибут loginUrl устанавливается в значение «Logon.aspx». URL-адрес Logon.aspx используется для переадресации в случае, если ASP.NET не находит в запросе файл Cookie проверки подлинности.
Атрибут name устанавливается в значение «.ASPXFORMSAUTH». Задает суффикс для имени файла Cookie, содержащего билет проверки подлинности.
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> </system.web>
В элементе system.web создайте элемент authorization:
<system.web> <authentication mode="Forms"> <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> </authorization> </system.web>
В элементе authorization создайте элемент deny и установите значение его атрибута users равным «?». Атрибут указывает, что для пользователей, не прошедших проверку (представленных «?»), запрещен доступ к ресурсам данного приложения.
<system.web> <authentication mode="Forms"> <forms loginUrl="logon.aspx" name=".ASPXFORMSAUTH"> </forms> </authentication> <authorization> <deny users="?" /> </authorization> </system.web>
Сохраните изменения и закройте файл Web.config.
Создание страницы входа
При запросе страницы из веб-узла пользователи, не прошедшие проверку подлинности, перенаправляются на страницу под названием Logon.aspx. Имя данного файла было указано ранее в файле Web.config.
На странице Logon.aspx собираются учетные данные пользователей (адрес электронной почты и пароль) и производится проверка их подлинности. Если пользователь успешно прошел проверку подлинности, то со страницы входа он перенаправляется на первоначально запрошенную страницу. В этом примере допустимые учетные записи жестко заданы в коде страницы.
Примечание о безопасности. |
---|
В данном примере присутствует текстовое поле, куда вводятся пользовательские данные, которые представляют потенциальную угрозу безопасности. По умолчанию на веб-страницах ASP.NET проверяются введенные пользователем данные на наличие сценариев и HTML-элементов. Дополнительные сведения см. в разделе Общие сведения об использовании сценариев. |
Создание страницы входа
Создайте страницу ASP.NET под названием Logon.aspx в корневой папке приложения.
Скопируйте в нее следующие исправления и код:
<%@ Page Language="VB" %> <%@ Import Namespace="System.Web.Security" %> <script runat="server"> Sub Logon_Click(ByVal sender As Object, ByVal e As EventArgs) If ((UserEmail.Text = "jchen@contoso.com") And _ (UserPass.Text = "37Yj*99Ps")) Then FormsAuthentication.RedirectFromLoginPage _ (UserEmail.Text, Persist.Checked) Else Msg.Text = "Invalid credentials. Please try again." End If End Sub </script> <html> <head id="Head1" runat="server"> <title>Forms Authentication - Login</title> </head> <body> <form id="form1" runat="server"> <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" runat="server" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" runat="server" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" runat="server" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" runat="server" /> <p> <asp:Label ID="Msg" ForeColor="red" runat="server" /> </p> </form> </body> </html>
<%@ Page Language="C#" %> <%@ Import Namespace="System.Web.Security" %> <script runat="server"> void Logon_Click(object sender, EventArgs e) { if ((UserEmail.Text == "jchen@contoso.com") && (UserPass.Text == "37Yj*99Ps")) { FormsAuthentication.RedirectFromLoginPage (UserEmail.Text, Persist.Checked); } else { Msg.Text = "Invalid credentials. Please try again."; } } </script> <html> <head id="Head1" runat="server"> <title>Forms Authentication - Login</title> </head> <body> <form id="form1" runat="server"> <h3> Logon Page</h3> <table> <tr> <td> E-mail address:</td> <td> <asp:TextBox ID="UserEmail" runat="server" /></td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" ControlToValidate="UserEmail" Display="Dynamic" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Password:</td> <td> <asp:TextBox ID="UserPass" TextMode="Password" runat="server" /> </td> <td> <asp:RequiredFieldValidator ID="RequiredFieldValidator2" ControlToValidate="UserPass" ErrorMessage="Cannot be empty." runat="server" /> </td> </tr> <tr> <td> Remember me?</td> <td> <asp:CheckBox ID="Persist" runat="server" /></td> </tr> </table> <asp:Button ID="Submit1" OnClick="Logon_Click" Text="Log On" runat="server" /> <p> <asp:Label ID="Msg" ForeColor="red" runat="server" /> </p> </form> </body> </html>
На странице содержатся серверные элементы управления ASP.NET, с помощью которых производится сбор сведений о пользователе, и флажок, который пользователи могут установить для того, чтобы сохранить свои учетные данные для входа. В обработчике кнопки Log OnClick содержится код, с помощью которого осуществляется проверка адреса электронной почты и пароля пользователя на соответствие жестко заданным значениям. (Надежный пароль — это пароль, состоящий из различных неалфавитных символов, длина которого составляет не менее восьми символов.) Если учетные записи пользователя верны, код вызывает метод класса FormsAuthentication под названием RedirectFromLoginPage, передающий имя пользователя и логическое значение (производное от флажка), показывающий, сохранен ли билет проверки подлинности в качестве файла Cookie. Посредством метода пользователь перенаправляется на первоначально запрошенную страницу. Если учетные записи пользователя не совпадают, то отображается сообщение об ошибке. Обратите внимание, что в страницу импортируется пространство имен System.Web.Security, содержащее класс FormsAuthentication.
Создание страницы по умолчанию
Например, создайте страницу ASP.NET в корневой папке приложения. Поскольку в файле конфигурации указано, что доступ к ресурсам приложения ASP.NET (которые включают ASPX-файлы, но не включает такие статические файлы, как HTML-файлы или файлы мультимедиа, например изображения, музыку и т. п.) запрещен для всех пользователей, не прошедших проверку, то когда пользователь запрашивает страницу, производится проверка подлинности учетных записей пользователя с помощью форм и, в случае необходимости, пользователь перенаправляется на страницу входа. Кроме того, с помощью созданной страницы пользователи могут выполнять выход, после которого очищается содержимое сохраненного билета проверки подлинности (файл Cookie).
Создание страницы по умолчанию
Создайте страницу ASP.NET под названием Default.aspx в корневой папке приложения.
Скопируйте в нее следующие исправления и код:
<%@ Page Language="VB" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script runat="server"> Sub Page_Load(ByVal Src As Object, ByVal e As EventArgs) Welcome.Text = "Hello, " & Context.User.Identity.Name End Sub Sub Signout_Click(ByVal sender As Object, ByVal e As EventArgs) FormsAuthentication.SignOut() Response.Redirect("Logon.aspx") End Sub </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" runat="server" /> <form id="Form1" runat="server"> <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" runat="server" /><p> </form> </body> </html>
<%@ Page Language="C#" %> <html> <head> <title>Forms Authentication - Default Page</title> </head> <script runat="server"> void Page_Load(object sender, EventArgs e) { Welcome.Text = "Hello, " + Context.User.Identity.Name; } void Signout_Click(object sender, EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("Logon.aspx"); } </script> <body> <h3> Using Forms Authentication</h3> <asp:Label ID="Welcome" runat="server" /> <form id="Form1" runat="server"> <asp:Button ID="Submit1" OnClick="Signout_Click" Text="Sign Out" runat="server" /><p> </form> </body> </html>
На странице отображается подтвержденная идентификация пользователя, заданная классом FormsAuthentication и доступная на странице ASP.NET в качестве свойства Context.User.Identity.Name. Обработчик кнопки Sign Out под названием Click содержит код, вызывающий метод SignOut для очистки идентификации пользователя и удаления билета проверки подлинности (файла Cookie). Затем производится перенаправление пользователя на страницу входа.
См. также
Основные понятия
Основные методы обеспечения безопасности веб-приложений
Ссылки
Общие сведения об элементах управления входом ASP.NET