Поделиться через


Членство

от Корпорации Майкрософт

Примечание

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

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

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

ASP.NET членство основывается на успешном выполнении модели проверки подлинности с помощью форм ASP.NET 1.x. ASP.NET проверка подлинности с помощью форм позволяет легко включить форму входа в приложение ASP.NET и проверить пользователей на соответствие базе данных или другому хранилищу данных. Члены класса FormsAuthentication позволяют обрабатывать файлы cookie для проверки подлинности, проверка для допустимого входа, выхода пользователя из системы и т. д. Однако для реализации проверки подлинности с помощью форм в приложении ASP.NET 1.x может потребоваться достаточное количество кода.

Членство в ASP.NET 2.0 является важным достижением по сравнению с использованием только проверки подлинности с помощью форм. (Членство является наиболее надежным в сочетании с проверкой подлинности с помощью форм, но использование проверки подлинности на основе форм не является обязательным требованием.) Как вы скоро увидите, вы можете использовать ASP.NET Членство и элементы управления для входа в ASP.NET 2.0 для реализации мощной системы членства без написания кода.

Реализация членства в ASP.NET 2.0

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

  1. Создайте базу данных членства (если в качестве хранилища членства используется SQL Server).

  2. Укажите параметры членства в файлах конфигурации приложений. (Членство включено по умолчанию.)

  3. Определите тип хранилища членства, которое вы хотите использовать. Доступные параметры описаны ниже.

    • Microsoft SQL Server (версия 7.0 или более поздняя)
    • Хранилище Active Directory
    • Настраиваемый поставщик членства
  4. Настройте приложение для проверки подлинности ASP.NET forms. Еще раз членство предназначено для использования преимуществ проверки подлинности с помощью форм, но использование проверки подлинности на основе форм не является обязательным требованием.

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

Создание базы данных членства

Если в качестве хранилища членства используется SQL Server 7.0 или более поздней версии, для настройки базы данных можно использовать служебную программу aspnet_regsql (доступную в командной строке Visual Studio .NET 2005). Служебную программу aspnet_regsql можно использовать в качестве средства командной строки или с помощью мастера графического пользовательского интерфейса. Самый простой способ настройки базы данных — это метод мастера. Чтобы получить доступ к мастеру, просто выполните следующую команду:

aspnet_regsql W

После выполнения этой команды вы получите мастер установки ASP.NET SQL Server, как показано ниже.

Снимок экрана, на котором показан мастер настройки сервера точки A P NET S Q L.

Рисунок 1

Мастер установки ASP.NET SQL Server создает веб-сайт в экземпляре, который вы указываете в мастере. Однако ASP.NET будет использовать строку подключения в файле machine.config для подключения к базе данных. По умолчанию эта строка подключения указывает на экземпляр SQL Server 2005, поэтому при использовании экземпляра SQL Server 2000 или SQL Server 7.0 необходимо изменить строку подключения в файле machine.config. Эта строка подключения может находиться здесь:

<configuration>
    <connectionStrings>
      <add name="LocalSqlServer"
         connectionString="data source=(local);
         Integrated Security=SSPI;Initial Catalog=aspnetdb;"  
         providerName="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

К сожалению, если вы не измените строку подключения, ASP.NET не приведет к описательной ошибке. Он будет продолжать жаловаться, говоря, что вы не создали базу данных. В приведенном выше случае я изменил строку подключения так, чтобы она указывала на локальный экземпляр SQL Server 2000.

Указание конфигурации и добавление пользователей и ролей

Следующим шагом в настройке членства является добавление необходимых сведений в файл web.config приложения. В ASP.NET 1.x изменение файла web.config иногда было затруднено из-за использования lowerCamelCase и отсутствия Intellisense. Visual Studio .NET 2005 значительно упрощает задачу с помощью Intellisense для файлов конфигурации, но ASP.NET 2.0 идет еще дальше, предоставляя веб-интерфейс для редактирования файлов конфигурации.

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

Снимок экрана: панель инструментов Обозреватель решения с выбранным web.config.

Рис. 2

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

  • Дом
  • Безопасности Настройка пользователей, ролей и доступа.
  • Приложения Настройка параметров приложения.
  • Поставщика Настройте и проверьте поставщик членства в приложениях.

Средство администрирования веб-сайтов позволяет легко создавать новых пользователей, создавать новые роли и управлять пользователями и ролями. Эта возможность недоступна в интерфейсе Windows. Интерфейс Windows позволяет легко определять параметры авторизации, а также добавлять и удалять поставщиков, а также управлять ими, которые отсутствуют в средстве администрирования веб-сайтов.

Чтобы запустить интерфейс Windows, откройте оснастку Службы IIS, щелкните правой кнопкой мыши приложение и выберите пункт Свойства. Перейдите на вкладку ASP.NET и нажмите кнопку Изменить конфигурацию. (Для включения кнопки Изменить конфигурацию приложение должно быть запущено в ASP.NET 2.0. Версию ASP.NET можно также настроить в диалоговом окне ASP.NET.) Диалоговое окно параметров конфигурации ASP.NET отображается, как показано ниже.

Снимок экрана, на котором показана вкладка

Рис. 3

На вкладке Общие перечислены строки подключения и параметры приложения. Все параметры курсивом определяются в родительском файле конфигурации (machine.config или web.config на более высоком уровне), а параметры, не указанные курсивом, находятся в файле конфигурации приложений. Если параметр добавляется, удаляется или редактируется на уровне приложения, ASP.NET добавит, удалит или изменит параметр на уровнях приложения web.config вместо удаления параметра из файла конфигурации, из которого он наследуется.

Ниже показана вкладка Проверка подлинности. Здесь вы настроите параметры членства. Здесь можно настроить параметры проверки подлинности с помощью форм, поставщиков членства и поставщиков ролей.

Снимок экрана, на котором показана вкладка

Рис. 4

Реализация членства в приложении

Самый простой способ реализовать членство ASP.NET 2.0 в приложении — использовать предоставленные элементы управления Вход в систему. Этот метод позволяет реализовать основы членства ASP.NET 2.0 без написания кода.

В ASP.NET 2.0 доступны следующие элементы управления входом:

Управление входом

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

В ASP.NET 1.x разработчикам приходилось писать достаточное количество кода, чтобы выполнить поиск при использовании проверки подлинности с помощью форм. С помощью членства ASP.NET 2.0 вы можете проверять пользователей, не написав код. ASP.NET автоматически выполнит поиск пользователя. (Если вы используете элемент управления "Вход" без ASP.NET членства, для проверки пользователя можно использовать метод OnAuthenticate .)

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

Элемент управления LoginView — это шаблонный элемент управления, который по умолчанию предоставляет два шаблона; AnonymousTemplate и LoggedInTemplate. Отображаемый шаблон определяется тем, вошел ли пользователь в систему членства. Этот элемент управления обычно используется для отображения элемента управления Вход, когда пользователь еще не вошел в систему, и элемента управления LoginStatus и (или) других элементов управления для входа, когда пользователь выполнил вход. Если вы используете управление ролями в приложении ASP.NET, элемент управления LoginView может отображать определенный шаблон на основе роли пользователей. (Дополнительные сведения об управлении ролями ASP.NET будут рассмотрены позже.)

Управление восстановлением паролей

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

Элемент управления LoginStatus

Элемент управления LoginStatus используется для отображения индикатора входа для пользователей, которые не вошли в систему, и индикатора выхода для пользователей, которые вошли в систему в данный момент. Свойство Request.IsAuthenticated используется для определения отображаемого индикатора. Индикатор, отображаемый элементом управления LoginStatus, может быть текстовым (реализованным с помощью свойств LoginText и LogoutText ) или изображениями (реализованными с помощью свойств LoginImageUrl и LogoutImageUrl ).

Когда пользователь выходит из системы с помощью элемента управления LoginStatus, он перенаправляется по URL-адресу, указанному свойством LogoutPageUrl . Если это свойство не задано, текущая страница обновляется. Так как сайт, скорее всего, защищен проверкой подлинности с помощью форм, обновление текущей страницы перенаправит пользователя на страницу входа для сайта.

Элемент управления LoginName

Элемент управления LoginName отображает имя пользователя, выполнившего вход на сайт.

Элемент управления CreateUserWizard

Элемент управления CreateUserWizard предоставляет пользователям удобный способ регистрации в системе членства. Вы можете добавить шаги (реализованные в виде коллекции WizardSteps) с помощью интерфейса, показанного ниже.

Снимок экрана: диалоговое окно

Рис. 5

CreateUserWizard — это шаблонный элемент управления, производный от класса Wizard и предоставляющий следующие шаблоны:

  • HeaderTemplate Этот шаблон управляет внешним видом заголовка мастера.
  • Боковая панельTemplate Этот шаблон управляет внешним видом боковой панели мастера.
  • StartNavigationTemplate Этот шаблон управляет внешним видом навигации мастера на начальном шаге.
  • StepNavigationTemplate Этот шаблон управляет внешним видом области навигации, если не на начальном или завершаем шаге.
  • FinishNavigationTemplate Этот шаблон управляет внешним видом области навигации на этапе завершения.

Кроме того, для каждого шага, добавляемого в мастер, ASP.NET создадут настраиваемый шаблон, содержащий contentTemplate и CustomNavigationTemplate для этого шага. Полные сведения о настройке CreateUserWizard см. в документации по VS.NET 2005:

Элемент управления ChangePassword

Элемент управления ChangePassword позволяет пользователям изменять свой пароль. Если свойство DisplayUserName имеет значение true (по умолчанию — false), пользователь может изменить свой пароль, если не выполнил вход. Если пользователь уже вошел в систему и свойство DisplayUserName имеет значение true, пользователь сможет изменить пароль другого пользователя, который не вошел в систему, если он знает идентификатор этого пользователя.

Имейте в виду, что если вы хотите, чтобы пользователи могли изменять пароли без необходимости входа в систему, необходимо убедиться, что страница, на которой отображается элемент управления ChangePassword, разрешает анонимный доступ. Очевидно, что пользователям придется указать свой старый пароль, чтобы изменить свой пароль.

Управление ролями

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

Управление ролями не является требованием в ASP.NET членства, и членство не является требованием для использования управления ролями. Тем не менее, два хорошо дополняют друг друга, и вполне вероятно, что разработчики будут использовать их в сочетании друг с другом.

Чтобы включить управление ролями в приложении, внесите следующие изменения в файл web.config:

<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />

Если атрибут cacheRolesInCookie имеет значение true, ASP.NET кэширует членство пользователей в файле cookie на клиенте. Это позволяет выполнять поиск ролей без вызовов RoleProvider. При использовании этого атрибута разработчикам рекомендуется убедиться, что для атрибута cookieProtection задано значение All. (Это параметр по умолчанию.) Это гарантирует шифрование данных файлов cookie и гарантирует, что содержимое файлов cookie не было изменено. Роли можно добавить с помощью средства администрирования веб-сайта. Она позволяет легко определять роли, настраивать доступ к частям сайта на основе этих ролей и назначать пользователям роли.

Снимок экрана: средство администрирования веб-сайта точки N E T с кнопкой

Рис. 6

Как показано выше, новые роли можно добавить, просто введя имя роли и нажав кнопку Добавить роль. Существующими ролями можно управлять или удалять, щелкнув соответствующую ссылку в списке существующих ролей.

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

Снимок экрана: средство администрирования веб-сайта точки N E T с кнопкой

Рис. 7

Установив флажок User Is In Role (Пользователь в роли), можно легко добавить пользователя к определенной роли. ASP.NET автоматически обновит базу данных членства соответствующими записями. Вам также потребуется настроить правила доступа для приложения. ASP.NET 1.x разработчики знакомы с этим с помощью <элемента авторизации> в файле web.config, и этот параметр по-прежнему доступен в ASP.NET 2.0. Однако проще управлять правилами доступа с помощью средства администрирования веб-сайтов, как показано ниже.

Снимок экрана, на котором показано средство Администрирования веб-сайта точки A P N E T с элементами, выбранными в разделе Пользователи и роли.

Рис. 8

В этом случае выделена папка "Администрирование" (ее трудно увидеть, так как средство выделяет ее светло-серым цветом), а роль "Администраторы" получила доступ. Все остальные пользователи отклоняются. Вы можете щелкнуть значок головки, чтобы выбрать правило, а затем использовать кнопки Переместить вверх и Вниз, чтобы упорядочить правила. Как и в случае с элементом авторизации> ASP.NET<, правила обрабатываются в том порядке, в котором они отображаются. Другими словами, если порядок правил, приведенный выше, был изменен, никто не будет иметь доступа к папке "Администрирование", так как первое правило, которое ASP.NET столкнется, будет правилом, которое запрещает всем в папку.

ASP.NET 2.0 добавляет web.config файл в папку, для которой задано правило доступа. Правила доступа можно изменить с помощью файла конфигурации или средства администрирования веб-сайтов. Другими словами, средство администрирования веб-сайта — это просто интерфейс, с помощью которого файл конфигурации можно редактировать в удобной для пользователя среде.

Использование ролей в коде

API для управления ролями не изменялся с версии 1.x. Метод IsInRole используется для определения того, имеет ли пользователь определенную роль.

if (User.IsInRole(Administrators)) {
    btnManageSite.Visible = true;
}

ASP.NET также создает экземпляр RolePrincipal в качестве члена текущего контекста. Объект RolePrincipal можно использовать для получения всех ролей, к которым принадлежит пользователь, следующим образом:

string[] userRoles = ((RolePrincipal)User).GetRoles();

Использование RoleGroups с элементом управления LoginView

Теперь, когда у вас есть представление об управлении ролями и членстве, давайте кратко обсудим, как элемент управления LoginView использует преимущества этой возможности в ASP.NET 2.0. Как уже говорилось ранее, элемент управления LoginView является шаблонным элементом управления, который по умолчанию содержит два шаблона. AnonymousTemplate и LoggedInTemplate. В диалоговом окне Задачи LoginView находится ссылка (показанная ниже), которая позволяет изменять группы ролей.

Снимок экрана: элемент управления

Рис. 9

Каждый объект RoleGroup содержит массив строк, определяющий, к каким ролям применяется RoleGroup. Чтобы добавить новую группу RoleGroup в элемент управления LoginView, щелкните ссылку Изменить группы ролей. На изображении выше видно, что добавлена новая группа ролей для администраторов. Выбрав roleGroup (RoleGroup[0]) в раскрывающемся списке Представления, я могу настроить шаблон, который будет отображаться только для членов роли "Администраторы". На рисунке ниже добавлена новая группа ролей, которая применяется к членам роли "Продажи" и роли "Распространителя". При этом в раскрывающемся списке Представления в диалоговом окне Задачи LoginView добавляется вторая группа ролей, и все, что добавлено в этот шаблон, будет отображаться любому пользователю с ролью "Продажи" или "Распространителя".

Снимок экрана: диалоговое окно редактора коллекции групп ролей с раскрывающимся списком с параметром

Рис. 10

Переопределение существующего поставщика членства

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

public class jForumMembershipProvider : SqlMembershipProvider {
    public jForumMembershipProvider() {

    }
    public override MembershipUser CreateUser(
    string username,
    string password,
    string email,
    string passwordQuestion,
    string passwordAnswer,
    bool isApproved,
    object providerUserKey,
    out MembershipCreateStatus status) {
        // your own implementation
        return base.CreateUser(
        username,
        password,
        email,
        passwordQuestion,
        passwordAnswer,
        isApproved,
        providerUserKey,
        out status);
    }
}

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

Создание собственного поставщика членства

Чтобы создать собственный поставщик членства, сначала необходимо создать класс, наследующий от класса MembershipProvider. Если вы используете VB.NET, Visual Studio 2005 добавит заглушки для всех методов, которые необходимо переопределить. Если вы используете C#, добавьте заглушки.

Вам потребуется переопределить следующее:

  • Свойство ApplicationName
  • Функция ChangePassword
  • Функция ChangePasswordQuestionAndAnswer
  • Функция CreateUser
  • Функция DeleteUser
  • Свойство EnablePasswordReset
  • Свойство EnablePasswordRetrieval
  • Функция FindUsersByEmail
  • Функция FindUsersByName
  • Функция GetAllUsers
  • Функция GetNumberOfUsersOnline
  • Функция GetPassword
  • Функция GetUser
  • Функция GetUserNameByEmail
  • Свойство MaxInvalidPasswordAttempts
  • Свойство MinRequiredNonAlphanumericCharacters
  • Свойство MinRequiredPasswordLength
  • Свойство PasswordAttemptWindow
  • Свойство PasswordFormat
  • Свойство PasswordStrengthRegularExpression
  • Свойство RequiresQuestionAndAnswer
  • Свойство RequiresUniqueEmail
  • Функция ResetPassword
  • Разблокировка пользовательской функции
  • Функция UpdateUser
  • Функция ValidateUser

Это довольно большой список для реализации в качестве разработчика C#. Вам может быть проще создать класс в VB.NET без какой-либо реализации, а затем использовать .NET Reflector или аналогичное средство для преобразования кода в C#.

Строка подключения и другие свойства должны иметь значения по умолчанию в методе Initialize. (Метод Initialize запускается при загрузке поставщика во время выполнения.) Второй параметр метода Initialize имеет тип System.Collections.Specialized.NameValueCollection и является ссылкой на <элемент add> , связанный с настраиваемым поставщиком в файле web.config. Эта запись выглядит следующим образом:

<system.web>
  <authentication mode="Forms"/>
  <membership
  defaultProvider="jForumCustomMembershipProvider" >
    <providers>
      <add name="jForumCustomMembershipProvider"
      type="jForumCustomMembershipProvider"
      requiresQuestionAndAnswer="true"
      connectionString="Provider=Microsoft.Jet.
        OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
        App_Data\Members.mdb;Persist Security
        Info=False"
        />
    </providers>
  </membership>
</system.web>

Ниже приведен пример метода Initialize.

public override void Initialize(string name,
    System.Collections.Specialized.NameValueCollection config) {

    if (config["requiresQuestionAndAnswer"])
        _requiresQuestionAndAnswer = true;
    _connString = config["connectionString"];
    base.Initialize(name, config);
}

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

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