Настройка веб-сайта, использующего службы приложений (C#)

Скотт Митчелл

Примечание

С момента написания этой статьи поставщики членства ASP.NET были заменены ASP.NET Identity. Мы настоятельно рекомендуем обновить приложения для использования платформы ASP.NET Identity , а не поставщиков членства, которые были представлены на момент написания этой статьи. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, включая :

  • более высокая производительность;
  • Улучшенная расширяемость и тестируемость
  • Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
  • Поддержка удостоверений на основе утверждений
  • Улучшенное взаимодействие с ASP.Net Core

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

Введение

ASP.NET версии 2.0 появился ряд служб приложений, которые являются частью платформа .NET Framework и служат набором служб стандартных блоков, которые можно использовать для добавления расширенных функциональных возможностей веб-приложения. К службам приложений относятся:

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

API служб приложений не привязаны к определенной реализации. Вместо этого вы указываете службам приложений использовать определенный поставщик, и этот поставщик реализует службу с помощью определенной технологии. Наиболее часто используемые поставщики для интернет-приложений, размещенных в компании-хостинге, — это поставщики, использующие реализацию SQL Server базы данных. Например, является поставщиком для API членства, SqlMembershipProvider который хранит сведения об учетной записи пользователя в базе данных Microsoft SQL Server.

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

Примечание

API служб приложений были разработаны с использованием модели поставщика— шаблона проектирования, который позволяет предоставлять сведения о реализации API во время выполнения. Платформа .NET Framework поставляется с рядом поставщиков служб приложений, которые можно использовать, например SqlMembershipProvider и SqlRoleProvider, которые являются поставщиками для API членства и ролей, использующих реализацию базы данных SQL Server. Вы также можете создать и подключаемый модуль пользовательского поставщика. На самом деле веб-приложение Book Reviews уже содержит настраиваемый поставщик для API карты сайта (ReviewSiteMapProvider), который создает карту сайта на основе данных в Genres таблицах и Books в базе данных.

Это руководство начинается с того, как я расширил веб-приложение Book Reviews для использования API членства и ролей. Затем в нем рассматривается развертывание веб-приложения, использующего службы приложений с реализацией базы данных SQL Server, и завершается устранением распространенных проблем с управлением учетными записями пользователей и ролями в рабочей среде.

Обновления к приложению "Обзоры книг"

За последние пару учебников веб-приложение Book Reviews было обновлено со статического веб-сайта до динамического, управляемого данными веб-приложения с набором страниц администрирования для управления жанрами и обзорами. Однако этот раздел администрирования в настоящее время не защищен— любой пользователь, который знает (или угадывает) URL-адрес страницы администрирования, может вальсировать и создавать, изменять или удалять отзывы на нашем сайте. Распространенный способ защиты определенных частей веб-сайта — реализовать учетные записи пользователей, а затем использовать правила авторизации URL-адресов, чтобы ограничить доступ определенным пользователям или ролям. Веб-приложение Book Reviews, доступное для скачивания в этом руководстве, поддерживает учетные записи пользователей и роли. Она имеет одну роль с именем Администратор, и только пользователи с этой ролью могут получить доступ к страницам администрирования.

Примечание

Я создал три учетные записи пользователей в веб-приложении Book Reviews: Scott, Jisun и Алиса. У всех трех пользователей один и тот же пароль: пароль! Скотт и Джисун находятся в Администратор роли, Алиса нет. Страницы сайта, не относящиеся к администрированию, по-прежнему доступны анонимным пользователям. То есть вам не нужно входить в систему, чтобы посетить сайт, если вы не хотите администрировать его. В этом случае вы должны войти в качестве пользователя в роли Администратор.

Страница master приложения Book Reviews была обновлена для включения другого пользовательского интерфейса для прошедших проверку подлинности и анонимных пользователей. Если анонимный пользователь заходит на сайт, он увидит ссылку Вход в правом верхнем углу. Пользователь, прошедший проверку подлинности, увидит сообщение "Назад добро пожаловать, имя пользователя!" и ссылку для выхода из системы. Существует также страница входа (~/Login.aspx), которая содержит веб-элемент управления входа, предоставляющий пользовательский интерфейс и логику для проверки подлинности посетителя. Создавать новые учетные записи могут только администраторы. (В папке есть страницы для создания учетных записей пользователей ~/Admin и управления ими.)

Настройка API членства и ролей

Веб-приложение Book Reviews использует API членства и ролей для поддержки учетных записей пользователей и группирования этих пользователей по ролям (а именно Администратор роли). Классы SqlMembershipProvider поставщиков и SqlRoleProvider используются, так как мы хотим хранить сведения об учетной записи и роли в базе данных SQL Server.

Примечание

Это руководство не предназначено для подробного изучения настройки веб-приложения для поддержки API членства и ролей. Подробные сведения об этих API-интерфейсах и действиях, которые необходимо предпринять для настройки веб-сайта для их использования, см. в учебниках по безопасности веб-сайтов.

Чтобы использовать службы приложений с SQL Server базой данных, необходимо сначала добавить объекты базы данных, используемые этими поставщиками, в базу данных, в которой должны храниться сведения об учетной записи пользователя и роли. Эти необходимые объекты базы данных включают различные таблицы, представления и хранимые процедуры. Если не указано иное, SqlMembershipProvider классы поставщиков и SqlRoleProvider используют базу данных ASPNETDB SQL Server Express Edition, расположенную в папке приложенияApp_Data. Если такая база данных не существует, она автоматически создается с необходимыми объектами базы данных этими поставщиками во время выполнения.

Можно( и обычно идеально) создать объекты базы данных служб приложений в той же базе данных, где хранятся данные конкретного приложения веб-сайта. Платформа .NET Framework поставляется со средством с именем aspnet_regsql.exe , которое устанавливает объекты базы данных в указанной базе данных. Я пошел вперед и использовал это средство для добавления этих объектов Reviews.mdf в базу данных в папке App_Data (база данных разработки). Мы рассмотрим, как использовать это средство далее в этом руководстве при добавлении этих объектов в рабочую базу данных.

При добавлении объектов базы данных служб приложений в базу данных, отличающуюся ASPNETDB от , необходимо настроить конфигурации SqlMembershipProvider классов поставщика и SqlRoleProvider таким образом, чтобы они использовали соответствующую базу данных. Чтобы настроить поставщик членства, <добавьте элемент членства> в <system.web> разделе в Web.config; используйте <элемент roleManager> для настройки поставщика ролей. Следующий фрагмент кода взят из приложения Web.config Book Reviews и показывает параметры настройки для API членства и ролей. Обратите внимание, что оба регистрируют новый поставщик ( ReviewMembership и ReviewRole ), которые используют поставщиков SqlMembershipProvider и SqlRoleProvider соответственно.

<configuration>
    <system.web>
        ...

        <membership defaultProvider="ReviewMembership">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlMembershipProvider" 
                     name="ReviewMembership" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </membership>

        <roleManager enabled="true" defaultProvider="ReviewRole">
            <providers>
                <clear />

                <add type="System.Web.Security.SqlRoleProvider" 
                     name="ReviewRole" 
                     connectionStringName="ReviewsConnectionString" 
                     applicationName="BookReviews" />
            </providers>
        </roleManager>

        ...
    </system.web>
</configuration>

Элемент Web.config file также <authentication> настроен для поддержки проверки подлинности на основе форм.

<configuration>
    <system.web>
        ...

        <authentication mode="Forms" />

        ...
    </system.web>
</configuration>

Ограничение доступа к страницам администрирования

ASP.NET упрощает предоставление или запрет доступа к определенному файлу или папке пользователю или роли с помощью функции авторизации URL-адреса . (Мы кратко рассмотрели авторизацию URL-адресов в учебнике Основные различия между IIS и сервером разработки ASP.NET и показали, как iis и сервер ASP.NET Development Server применяют правила авторизации URL-адресов для статического и динамического содержимого.) Так как мы хотим запретить доступ к папке~/Admin, кроме пользователей в роли Администратор, необходимо добавить правила авторизации URL-адресов в эту папку. В частности, правила авторизации URL-адресов должны разрешать пользователям в роли Администратор и запрещать всех остальных пользователей. Это достигается путем Web.config добавления файла в папку ~/Admin со следующим содержимым:

<?xml version="1.0"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Admin" />
            <deny users="*" />
        </authorization>
    </system.web>
</configuration>

Дополнительные сведения о ASP.NET функции авторизации URL-адресов и о том, как ее использовать для определения правил авторизации для пользователей и ролей, обязательно ознакомьтесь с руководствами по авторизации на основе пользователей и авторизации на основе ролей из учебников по безопасности веб-сайта.

Развертывание веб-приложения, использующего службы приложений

При развертывании веб-сайта, использующего службы приложений, и поставщика, который хранит сведения о службах приложений в базе данных, крайне важно, чтобы объекты базы данных, необходимые службам приложений, были созданы в рабочей базе данных. Изначально рабочая база данных не содержит этих объектов, поэтому при первом развертывании приложения (или при первом развертывании после добавления служб приложений) необходимо предпринять дополнительные действия, чтобы получить эти необходимые объекты базы данных в рабочей базе данных.

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

ASP.NET поставляется с хорошим средством администрирования веб-сайта (WSAT), которое можно запустить из Visual Studio и позволяет управлять учетной записью пользователя, ролями и правилами авторизации через веб-интерфейс. К сожалению, WSAT работает только для локальных веб-сайтов, а это означает, что его нельзя использовать для удаленного управления учетными записями пользователей, ролями и правилами авторизации для веб-приложения в рабочей среде. Мы рассмотрим различные способы реализации поведения, подобного WSAT, на рабочем веб-сайте.

Добавление объектов базы данных с помощью aspnet_regsql.exe

В руководстве по развертыванию базы данных показано, как скопировать таблицы и данные из базы данных разработки в рабочую базу данных. Эти методы, безусловно, можно использовать для копирования объектов базы данных служб приложений в рабочую базу данных. Другим вариантом aspnet_regsql.exe является средство, которое добавляет или удаляет объекты базы данных служб приложений из базы данных.

Примечание

Средство aspnet_regsql.exe создает объекты базы данных в указанной базе данных. Данные в этих объектах базы данных не переносятся из базы данных разработки в рабочую базу данных. Если вы хотите скопировать сведения об учетной записи пользователя и роли из базы данных разработки в рабочую базу данных, используйте методы, описанные в руководстве По развертыванию базы данных .

Рассмотрим, как добавить объекты базы данных в рабочую базу данных с помощью aspnet_regsql.exe средства . Начните с открытия windows Обозреватель и перехода к каталогу платформа .NET Framework версии 2.0 на компьютере , %WINDIR%\ Microsoft.NET\Framework\v2.0.50727. Там вы должны найти aspnet_regsql.exe инструмент. Это средство можно использовать из командной строки, но оно также включает графический пользовательский интерфейс; Дважды щелкните файл, aspnet_regsql.exe чтобы запустить его графический компонент.

Средство начинается с отображения экрана-заставки с объяснением его назначения. Нажмите кнопку Далее, чтобы перейти к экрану "Выбор параметра установки", как показано на рисунке 1. Здесь можно добавить объекты базы данных служб приложений или удалить их из базы данных. Так как мы хотим добавить эти объекты в рабочую базу данных, выберите параметр "Настроить SQL Server для служб приложений" и нажмите кнопку Далее.

Настройка SQL Server для служб приложений

Рис. 1. Выбор настройки SQL Server для служб приложений (щелкните для просмотра полноразмерного изображения)

На экране "Выбор сервера и базы данных" появится запрос на ввод сведений о подключении к базе данных. Введите сервер базы данных, учетные данные безопасности и имя базы данных, предоставленное вашей компанией по размещению веб-сайтов, и нажмите кнопку Далее.

Примечание

После ввода сервера базы данных и учетных данных может возникнуть ошибка при развертывании раскрывающегося списка базы данных. Средство aspnet_regsql.exe запрашивает sysdatabases системную таблицу, чтобы получить список баз данных на сервере, но некоторые компании веб-хостинга блокируют свои серверы баз данных, чтобы эти сведения не были общедоступными. При возникновении этой ошибки можно ввести имя базы данных непосредственно в раскрывающемся списке.

Предоставьте средству сведения о подключении к базе данных

Рис. 2. Предоставление средства со сведениями о подключении к базе данных (щелкните для просмотра полноразмерного изображения)

На следующем экране перечислены действия, которые будут выполняться, а именно, что объекты базы данных служб приложений будут добавлены в указанную базу данных. Нажмите кнопку Далее, чтобы выполнить это действие. Через несколько секунд отобразится окончательный экран с указанием того, что объекты базы данных были добавлены (см. рис. 3).

Успех! Объекты базы данных служб приложений добавлены в рабочую базу данных.

Рис. 3. Успех! Объекты базы данных служб приложений добавлены в рабочую базу данных (щелкните для просмотра полноразмерного изображения)

Чтобы убедиться, что объекты базы данных служб приложений успешно добавлены в рабочую базу данных, откройте SQL Server Management Studio и подключитесь к рабочей базе данных. Как показано на рисунке 4, теперь в базе данных должны отображаться таблицы баз данных служб приложений, aspnet_Applications, aspnet_Membership, aspnet_Usersи т. д.

Убедитесь, что объекты базы данных добавлены в рабочую базу данных.

Рис. 4. Подтверждение добавления объектов базы данных в рабочую базу данных (щелкните для просмотра полноразмерного изображения)

Вам потребуется использовать aspnet_regsql.exe средство только при первом развертывании веб-приложения или в первый раз после начала использования служб приложений. После того как эти объекты базы данных находятся в рабочей базе данных, их не нужно будет повторно добавлять или изменять.

Копирование учетных записей пользователей из среды разработки в рабочую среду

При использовании SqlMembershipProvider классов поставщиков и SqlRoleProvider для хранения сведений о службах приложений в базе данных SQL Server сведения об учетной записи пользователя и роли хранятся в различных таблицах баз данных, включая aspnet_Users, aspnet_Membership, aspnet_Rolesи aspnet_UsersInRoles. Если во время разработки вы создаете учетные записи пользователей в среде разработки, вы можете реплицировать эти учетные записи пользователей в рабочей среде, скопировав соответствующие записи из соответствующих таблиц базы данных. Если вы использовали мастер публикации баз данных для развертывания объектов базы данных служб приложений, возможно, вы также выбрали копирование записей, что приведет к тому, что учетные записи пользователей, созданные в разработке, также будут находиться в рабочей среде. Но в зависимости от параметров конфигурации может оказаться, что те пользователи, чьи учетные записи были созданы в разработке и скопированы в рабочую среду, не могут войти с рабочего веб-сайта. Что это дает?

SqlMembershipProvider Классы поставщиков и SqlRoleProvider были разработаны таким образом, что одна база данных могла служить хранилищем пользователей для нескольких приложений, где каждое приложение теоретически может иметь пользователей с перекрывающимися именами пользователей и ролями с одинаковыми именами. Чтобы обеспечить такую гибкость, база данных поддерживает список приложений в aspnet_Applications таблице, и каждый пользователь связан с одним из этих приложений. В частности, таблица aspnet_Users содержит ApplicationId столбец, который связывает каждого пользователя с записью aspnet_Applications в таблице.

В дополнение к столбцу ApplicationId таблица aspnet_Applications также содержит ApplicationName столбец, который предоставляет более понятное для человека имя приложения. Когда веб-сайт пытается работать с учетной записью пользователя, например при проверке учетных данных пользователя на странице входа, он должен сообщить классу SqlMembershipProvider , с каким приложением работать. Обычно это делается путем указания имени приложения, и это значение поступает из конфигурации поставщика в , в Web.config частности через applicationName атрибут .

Но что произойдет, applicationName если атрибут не указан в Web.config? В таком случае система членства использует корневой путь приложения в applicationName качестве значения. applicationName Если атрибут явно не задан в Web.config, существует вероятность того, что среда разработки и рабочая среда используют другой корень приложения и, следовательно, будут связаны с разными именами приложений в службах приложений. В случае такого несоответствия пользователи, созданные в среде разработки, будут иметь ApplicationId значение, которое не совпадает со значением ApplicationId для рабочей среды. В результате эти пользователи не смогут войти в систему.

Примечание

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

Хорошей новостью является то, что вы можете выполнить простой шаг, чтобы убедиться, что две среды используют одну и ту же ApplicationId среду — явно задать applicationName атрибут в Web.config для всех поставщиков служб приложений. Я явно задаю applicationName атрибуту значение "BookReviews" в элементах и , <roleManager> как показано в <membership> этом фрагменте кода.Web.config

<membership defaultProvider="ReviewMembership">
    <providers>
        <clear />

        <add type="System.Web.Security.SqlMembershipProvider" 
             name="ReviewMembership" 
             connectionStringName="ReviewsConnectionString" 
             applicationName="BookReviews" />
    </providers>
</membership>

Дополнительные сведения о настройке атрибута applicationName и его обоснование см. в записи блога Скотта Гатривсегда задавать свойство applicationName при настройке членства ASP.NET и других поставщиков.

Управление учетными записями пользователей в рабочей среде

Средство администрирования веб-сайтов ASP.NET (WSAT) упрощает создание учетных записей пользователей и управление ими, определение и применение ролей, а также написание правил авторизации на основе пользователей и ролей. Вы можете запустить WSAT из Visual Studio, перейдя на Обозреватель Решение и щелкнув значок конфигурации ASP.NET или выбрав в меню Веб-сайт или Проект пункт меню ASP.NET Конфигурация. К сожалению, WSAT может работать только с локальными веб-сайтами. Поэтому вы не можете использовать WSAT с рабочей станции для управления веб-сайтом в рабочей среде.

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

Напомним, что в предыдущем руководстве веб-приложение ~/Admin "Обзоры книг" было добавлено в папку, и эта папка была настроена таким образом, чтобы разрешить только пользователей с ролью Администратор. Я добавил в папку страницу с именем CreateAccount.aspx , из которой администратор может создать новую учетную запись пользователя. На этой странице используется элемент управления CreateUserWizard для отображения пользовательского интерфейса и серверной логики для создания новой учетной записи пользователя. Более того, я настроил элемент управления так, чтобы он включал элемент CheckBox, который предлагает добавить нового пользователя в роль Администратор (см. рис. 5). Немного поработав, вы можете создать пользовательский набор страниц, реализующий задачи, связанные с управлением пользователями и ролями, которые в противном случае были бы предоставлены WSAT.

Примечание

Дополнительные сведения об использовании API членства и ролей вместе с веб-элементами управления ASP.NET, связанными с именем входа, см. в руководстве по безопасности веб-сайтов. Дополнительные сведения о настройке элемента управления CreateUserWizard см. в руководствах по созданию учетных записей пользователей и хранению дополнительных сведений о пользователях или проверка статье Эриха ПетерсонаНастройка элемента управления CreateUserWizard.

Администраторы могут создавать новые учетные записи пользователей

Рис. 5. Администраторы могут создавать новые учетные записи пользователей (щелкните для просмотра полноразмерного изображения)

Если вам нужна полная функциональность WSAT проверка развертывание средства администрирования собственного веб-сайта, в котором автор Дэн Клем (Dan Clem) описывает процесс создания пользовательского средства, похожего на WSAT. Дэн делится исходным кодом своего приложения (на C#) и предоставляет пошаговые инструкции по его добавлению на размещенный веб-сайт.

Сводка

При развертывании веб-приложения, использующего реализацию базы данных служб приложений, необходимо сначала убедиться, что в рабочей базе данных есть необходимые объекты базы данных. Эти объекты можно добавить с помощью методов, описанных в руководстве по развертыванию базы данных . Кроме того, можно использовать средство aspnet_regsql.exe , как мы видели в этом руководстве. Другие проблемы, которые мы затронули, касались синхронизации имени приложения, используемого в средах разработки и рабочей среде (что важно, если вы хотите, чтобы пользователи и роли, созданные в среде разработки, были действительны в рабочей среде), а также методы управления пользователями и ролями в рабочей среде.

Счастливого программирования!

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

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах: