Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
С момента написания этой статьи провайдеры членства 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. Например, SqlMembershipProvider поставщик API членства, который хранит сведения об учетной записи пользователя в базе данных Microsoft SQL Server.
Использование служб приложений и поставщиков SQL Server добавляет некоторые проблемы при развертывании приложения. Для начала объекты базы данных служб приложений должны быть правильно созданы как в базах данных разработки, так и в рабочей среде и соответствующим образом инициализированы. Существуют также важные параметры конфигурации, которые необходимо сделать.
Замечание
API-интерфейсы служб приложений были разработаны с помощью модели поставщика, шаблона проектирования, позволяющего предоставлять сведения о реализации API во время выполнения. Платформа .NET Framework поставляется с рядом поставщиков служб приложений, которые можно использовать, таких как SqlMembershipProvider и SqlRoleProvider, являющиеся поставщиками для API членства и ролей, которые используют реализацию базы данных SQL Server. Вы также можете создать и подключить собственного поставщика. На самом деле веб-приложение "Обзоры книг" уже содержит настраиваемого поставщика API карты сайта (ReviewSiteMapProvider), который конструирует карту сайта из данных в таблицах Genres и Books баз данных.
В этом руководстве описывается, как я расширил веб-приложение "Обзоры книг" для использования API членства и ролей. Затем он описывает развертывание веб-приложения, использующего службы приложений с реализацией базы данных SQL Server, и завершается решением распространенных проблем с управлением учетными записями пользователей и ролями в рабочей среде.
Обновления приложения отзывов книг
За последние пару уроков веб-приложение Book Reviews было обновлено из статического веб-сайта в динамическое веб-приложение, основанное на данных, с набором страниц для администрирования управления жанрами и обзорами. Однако этот раздел администрирования в настоящее время не защищен — любой пользователь, который знает (или догадывается) URL-адрес страницы администрирования, может легко получить доступ и создавать, редактировать или удалять отзывы на нашем сайте. Распространенный способ защиты определенных частей веб-сайта — реализовать учетные записи пользователей, а затем использовать правила авторизации URL-адресов для ограничения доступа к определенным пользователям или ролям. Веб-приложение "Обзоры книг", доступное для скачивания с помощью этого руководства, поддерживает учетные записи пользователей и роли. Она имеет одну роль, определенную с именем "Администратор", и только пользователи в этой роли могут получить доступ к страницам администрирования.
Замечание
Я создал три учетные записи пользователей в веб-приложении "Отзывы книги": Скотт, Джисун и Алиса. У всех трех пользователей один и тот же пароль: пароль! Скотт и Джисун находятся в роли администратора, Алиса не является. Страницы, отличные от администрирования сайта, по-прежнему доступны анонимным пользователям. То есть вам не нужно входить на сайт, если вы не хотите администрировать его, в этом случае необходимо войти в качестве пользователя в роли администратора.
Главная страница приложения проверки книг была обновлена, чтобы включить другой пользовательский интерфейс для прошедших проверку подлинности и анонимных пользователей. Если анонимный пользователь посещает сайт, он видит ссылку для входа в правом верхнем углу. Пользователь, прошедший проверку подлинности, видит сообщение "Добро пожаловать обратно, имя пользователя!" и ссылку на выход. Существует также страница входа (~/Login.aspx), которая содержит веб-элемент управления login, который предоставляет пользовательский интерфейс и логику проверки подлинности посетителя. Только администраторы могут создавать новые учетные записи. (В папке есть страницы для создания учетных записей пользователей ~/Admin и управления ими.)
Настройка API членства и ролей
Веб-приложение "Обзоры книг" использует API членства и ролей для поддержки учетных записей пользователей и группирования этих пользователей в роли (а именно роль администратора). Классы поставщиков SqlMembershipProvider и SqlRoleProvider используются, так как мы хотим хранить сведения об учетной записи и роли в SQL Server базе данных.
Замечание
Это руководство не предназначено для подробного изучения при настройке веб-приложения для поддержки API членства и ролей. Для тщательного изучения этих API и действий, необходимых для настройки веб-сайта для их использования, ознакомьтесь с моими руководствами по безопасности веб-сайтов.
Чтобы использовать службы приложений с базой данных SQL Server, необходимо сначала добавить объекты базы данных, используемые этими поставщиками, в базу данных, в которой хранятся сведения о учетной записи пользователя и роли. Эти необходимые объекты базы данных включают различные таблицы, представления и хранимые процедуры. Если не указано иное, SqlMembershipProviderSqlRoleProvider классы поставщиков используют базу данных SQL Server Express Edition с именем ASPNETDB , расположенную в папке приложения App_Data ; если такая база данных не существует, она автоматически создается с необходимыми объектами базы данных этими поставщиками во время выполнения.
Можно создать объекты базы данных служб приложений в той же базе данных, где хранятся данные, относящиеся к приложению веб-сайта. Платформа .NET Framework поставляется с инструментом с именем aspnet_regsql.exe , который устанавливает объекты базы данных в указанной базе данных. Я прошел вперед и использовал это средство для добавления этих объектов Reviews.mdf в базу данных в App_Data папку (база данных разработки). Мы увидим, как использовать это средство далее в этом руководстве при добавлении этих объектов в рабочую базу данных.
При добавлении объектов базы данных служб приложений в базу данных, отличной от ASPNETDB, необходимо настроить конфигурации классов поставщиков SqlMembershipProvider и SqlRoleProvider, чтобы они использовали соответствующую базу данных. Чтобы настроить поставщика членства, добавьте <элемент членства> в <system.web>Web.configразделе ; используйте <элемент roleManager> для настройки поставщика ролей. Следующий фрагмент кода взят из приложения Web.config для отзывов о книгах и отображает настройки конфигурации для 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 файла <authentication> также настроен для поддержки проверки подлинности на основе форм.
<configuration>
<system.web>
...
<authentication mode="Forms" />
...
</system.web>
</configuration>
Ограничение доступа к страницам администрирования
ASP.NET упрощает предоставление или запрет доступа к определенному файлу или папке пользователем или ролью с помощью функции авторизации URL-адреса . (Мы кратко обсудили авторизацию URL-адресов в руководстве по основным различиям между IIS и ASP.NET сервером разработки и показали, как IIS и сервер разработки ASP.NET применяют правила авторизации URL-адресов по-разному для статического и динамического содержимого.) Так как мы хотим запретить доступ к ~/Admin папке, кроме тех пользователей в роли администратора, нам нужно добавить правила авторизации URL-адресов в эту папку. В частности, правила авторизации URL-адресов должны разрешать пользователей в роли Админа и отклонять всех остальных пользователей. Это достигается путем добавления Web.config файла в ~/Admin папку со следующим содержимым:
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>
</configuration>
Для получения дополнительных сведений о функции авторизации URL-адресов в ASP.NET и её использовании для назначения правил авторизации для пользователей и ролей, обязательно ознакомьтесь с руководствами по авторизации на основе пользователей и на основе ролей из учебников по безопасности веб-сайтов.
Развертывание веб-приложения, использующего службы приложений
При развертывании веб-сайта, использующего службы приложений и поставщика, который хранит сведения о службах приложений в базе данных, необходимо создать объекты базы данных, необходимые службам приложений в производственной базе данных. Изначально рабочая база данных не содержит эти объекты, поэтому при первом развертывании приложения (или при первом развертывании после добавления служб приложений) необходимо выполнить дополнительные действия, чтобы получить эти необходимые объекты базы данных в рабочей базе данных.
При развертывании веб-сайта, использующего службы приложений, может возникнуть еще одна проблема, если планируется реплицировать учетные записи пользователей, созданные в среде разработки, в рабочую среду. В зависимости от конфигурации членства и ролей возможно, что даже при успешном копировании учетных записей пользователей, созданных в среде разработки, в рабочую базу данных эти пользователи не могут войти в веб-приложение в рабочей среде. Мы рассмотрим причину этого вопроса и обсудим, как предотвратить его.
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 для служб приложений" и нажмите кнопку "Далее".
Рис. 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, который предоставляет более удобочитаемое имя для приложения. Когда веб-сайт пытается работать с учетной записью пользователя, например проверка учетных данных пользователя на странице входа, он должен сообщить классу SqlMembershipProvider , с каким приложением будет работать. Обычно это делается путем указания имени приложения, и это значение поступает из конфигурации поставщика в Web.config конкретно через applicationName атрибут.
Но что происходит, если applicationName атрибут не указан в Web.config? В таком случае система членства использует корневой путь приложения в качестве applicationName значения. Если атрибут applicationName не задан явным образом в Web.config, то существует вероятность того, что среда разработки и продуктовая среда используют разные корневые каталоги приложения и поэтому будут связаны с различными именами приложений в службах приложений. Если такое несоответствие возникает, то эти пользователи, созданные в среде разработки, будут иметь ApplicationId значение, которое не соответствует ApplicationId значению рабочей среды. В результате эти пользователи не смогут войти в систему.
Замечание
Если вы окажетесь в такой ситуации — с учетными записями пользователей, скопированными в рабочую среду с несоответствующим ApplicationId значением, можно составить запрос, чтобы обновить эти неверные ApplicationId значения до ApplicationId, используемых в рабочей среде. После обновления пользователи, учетные записи которых были созданы в среде разработки, теперь смогут войти в веб-приложение в рабочей среде.
Хорошая новость заключается в том, что существует простой способ убедиться, что обе среды используют один и тот же ApplicationId: явно задайте атрибут applicationName в Web.config для всех ваших поставщиков служб приложений. Я явно установил applicationName атрибут "BookReviews" в элементах <membership> и <roleManager>, как показано в этом фрагменте 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 Membership и других поставщиков.
Управление учетными записями пользователей в рабочей среде
Средство администрирования веб-сайтов 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, ознакомьтесь с руководством по созданию собственного средства администрирования веб-сайтов, в котором автор Дэн Клем описывает процесс создания пользовательского инструмента, подобного WSAT. Дэн делится исходным кодом приложения (в C#) и предоставляет пошаговые инструкции по добавлению его на размещенный веб-сайт.
Сводка
При развертывании веб-приложения, использующего реализацию базы данных служб приложений, необходимо сначала убедиться, что в рабочей базе данных есть необходимые объекты базы данных. Эти объекты можно добавить с помощью методов, описанных в руководстве по развертыванию базы данных ; Кроме того, вы можете использовать aspnet_regsql.exe это средство, как мы видели в этом руководстве. Другие проблемы, связанные с синхронизацией имени приложения, используемого в средах разработки и рабочей среды (важно, если вы хотите, чтобы пользователи и роли, созданные в среде разработки, были допустимыми в рабочей среде) и методы управления пользователями и ролями в рабочей среде.
Счастливое программирование!
Дальнейшее чтение
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- Утилита регистрации SQL Server ASP.NET (aspnet_regsql.exe)
- Создание базы данных служб приложений для SQL Server
- Создание схемы членства в SQL Server
- Изучение членства, ролей и профилей ASP.NET
- Развертывание собственного средства администрирования веб-сайта
- Руководства по безопасности веб-сайтов
- Обзор средства администрирования веб-сайта