Опубликован: 07.05.2010 | Доступ: свободный | Студентов: 1678 / 62 | Оценка: 4.56 / 4.06 | Длительность: 34:11:00
Лекция 18:

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

< Лекция 17 || Лекция 18: 123456789

Аутентификация с помощью API Membership

API Membership является готовой инфраструктурой в ASP.NET, предназначенной для организации управления аутентификацией пользователей. Он базируется на аутентификации форм, поэтому конфигурировать аутентификацию в Web.config нужно точно также, как при аутентификации форм. Единственное отличие, что хранение пользователей будет осуществляться не в конфигурационном файле, а в базе данных. И для управления задействуются классы Membership.

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

Для использования API Membership нужно выполнитиь следующие шаги:

  1. Сконфигурировать аутентификацию форм в корневом каталоге приложения и авторизацию в защищенных каталогах
  2. Создать и настроить базу данных для хранения удостоверений пользователей
  3. Занести в хранилище пользователей
  4. Создать страницу регистрации

Создание хранилища удостоверений

SQL Server 2005 создает базы данных и работает с ними как с отдельными файлами с расширением .mdf. По умолчанию эти файла размещаются в каталоге

C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data

Мы сами можем вручную создать файл базы данных для хранения удостоверений и добавить в нее таблицы с необходимыми полями. Но это может не стыковаться с API Membership, поскольку он ожидает базу данных определенной структуры. К тому же нужно будет прописывать в конфигурационном файле строку соединений с этой базой и другие конфигурационные параметры, необходимые для работы API Membership. Более простой вариант предусмотрели разработчики Visual Studio 2005, включив поддержку Membership в утилиту Web Site Administration Tool (WAT). Нам теперь вообще ничего делать не нужно, поскольку база данных нужной структуры для хранения удостоверений будет создана автоматически при первом запуске WAT, если в конфигурационном файле прописана секция аутентификации форм.

  • Создайте новый пустой проект командой File/New/Web Site
  • Откройте окно копирования проектов командой Website/Copy Web Site и скопируйте в новый пустой проект часть файлов из предыдущего проекта аутентификации с помощью форм

Тестовые страницы Default.aspx и MyDefault.aspx из предыдущего проекта, сконфигурированные для проверки аутентификации, будут следующими

<%@ Page Language="C#" %>
    
<script runat="server">
    
    protected void SignOutAction_Click(object sender, EventArgs e)
    {
        // Уничтожить cookie-набор 
        FormsAuthentication.SignOut();
        // Направить на страницу регистрации
        //FormsAuthentication.RedirectToLoginPage();
    }
</script>
    
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Страница с ограниченным доступом Default.aspx</h1>
        <p>
            <asp:Button ID="SignOutAction" runat="server" 
            Text="Отменить регистрацию" OnClick="SignOutAction_Click" />
            <asp:HyperLink ID="HyperLink1" runat="server" 
            NavigateUrl="~/MyDefault.aspx">На страницу MyDefault.aspx...
            </asp:HyperLink></p>
    </div>
    </form>
</body>
</html>
<%@ Page Language="C#" %>
    
<script runat="server">
    
    protected void SignOutAction_Click(object sender, EventArgs e)
    {
        // Уничтожить cookie-набор 
        FormsAuthentication.SignOut();
        // Направить на страницу регистрации
        //FormsAuthentication.RedirectToLoginPage();
    }
</script>
    
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <h1>
                Страница с ограниченным доступом MyDefault.aspx</h1>
            <p>
                <asp:Button ID="SignOutAction" runat="server" 
                OnClick="SignOutAction_Click" Text="Отменить регистрацию" />
                <asp:HyperLink ID="HyperLink1" runat="server" 
                NavigateUrl="~/Default.aspx">На страницу Default.aspx...
                </asp:HyperLink></p>
        </div>
    </form>
</body>
</html>

Код страницы регистрации MyLogin.aspx мы рассмотрим чуть позже, вместе с введенными изменениями.

  • Откройте в новом проекте скопированный файл web.config и удалите из него секцию <credentials> вместе с внесенными ранее пользователями. При этом должна остаться секция аутентификации форм

В результате конфигурационный файл должен стать таким

<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
	<system.web>
		<compilation debug="true" />
		<authentication mode="Forms">
			<forms name="MyCookieName"
				loginUrl="MyLogin.aspx"
				defaultUrl="MyDefault.aspx"
				protection="All"
				timeout="20"
				path="/"
				requireSSL="false"
				slidingExpiration="true"
				cookieless="AutoDetect"
				domain=""
				enableCrossAppRedirects="false">
			</forms>
		</authentication>
		<!-- Временно закомментировали, чтобы не требовал регистрации
		<authorization>
			<deny users="?"/>
		</authorization>
		-->
	</system.web>
</configuration>
  • Запустите утилиту WAT командой Website/ASP.NET Configuration и обратите внимание, как долго она запускается

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

  • В панели Solution Explorer щелкните на кнопке Refresh

Мы видим, что утилита WAT так долго запускалась потому, что добавила к проекту каталог App_Data (если до этого его еще не было) и создала в нем базу данных ASPNETDB.MDF, готовую для хранения удостоверений и согласованную с API Membership


  • В панели Solution Explorer двойным щелчком на файле ASPNETDB.MDF откройте соединение с этой базой данных и ознакомтесь в панели Server Explorer с ее структурой, типичной для SQL Server

Такой способ хранения удостоверений пользователей в локальной базе данных вместе с приложением очень удобен, поскольку позволяет перемещать сайт в любое место сервера или разворачивать на любом сервере без дополнительных настроек подключения SQL Server. Да и структуру базы данных утилита WAT создала такой, какая нужна инфраструктуре API Membership. Это значит, что все классы Membership будут согласованы с хранилищем удостоверений.

Утилита WAT автоматически создает хранилище удостоверений только в том случае, если обнаружит в корневом конфигурационном файле секцию

<authentication mode="Forms">

Если на момент запуска утилиты WAT файл конфигурации в корневом каталоге приложения отсутствует или в нем нет секции аутентификации на основе форм, то утилита базу данных не создает.

Для того, чтобы проверить работоспособность созданной локальной базы данных, выполните следующее:

  • Запустите утилиту WAT командой Website/ASP.NET Configuration
  • На вкладке Home щелкните на гиперссылке Provider Configuration, чтобы перейти на вкладку Provider
  • На вкладке Provider щелкните на гиперссылке Select a single provider for all site management data
  • В сгенерированном страницей ManageConsolidatedProviders.aspx отклике щелкните на гиперссылке Test

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

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

< Лекция 17 || Лекция 18: 123456789