Описание: Компонент членства в asp.net 2.0 предоставляет разработчикам набор очень простых и удобных в использовании интерфейсов для управления пользователями и их проверки. В этой статье будет кратко проанализирован принцип его реализации, показано, как его правильно использовать и как расширить.
1. Абстрактный класс MembershipProvider.
Во многих случаях мы не используем этот класс напрямую при использовании Membership. Класс MembershipProvider определяет некоторые абстрактные методы и абстрактные атрибуты. Именно эти методы и атрибуты составляют базовые спецификации интерфейса Membership, и все функции использования Membership в рамках .NET Framework вызываются через этот тип. Унаследованные классы предоставляют функции управления пользователями в различных средах, реализуя эти интерфейсы, и не оказывают никакого влияния на саму структуру Membership. Давайте посмотрим на определение прототипа MembershipProvider:
открытый абстрактный класс MembershipProvider : ProviderBase
...{
// События
public event MembershipValidatePasswordEventHandler ValidatingPassword;
// Методы
protected MembershipProvider();
string
username, string oldPassword, string newPassword)
; пароль, строка электронная почта, строка пароляВопрос, строка пароляОтвет, bool isApproved, объектProviderUserKey, out MembershipCreateStatus status);
защищенныйвиртуальный
byte[] DecryptPassword(byte[] encodedPassword)
; (строковый проход, int парольFormat, строковая соль);
защищенный виртуальный байт [] EncryptPassword (байт [] пароль)
;общедоступный абстрактный
MembershipUserCollection FindUsersByEmail (строка emailToMatch, int pageIndex, int pageSize, out int totalRecords);
, int pageIndex, int pageSize, out int totalRecords);
внутренняя
строка
GenerateSalt ()
; ответ);
общедоступный абстрактный MembershipUser GetUser (объектProviderUserKey, bool userIsOnline);
общедоступный абстрактный MembershipUser GetUser (строковое имя пользователя, bool userIsOnline);
внутренний MembershipUser GetUser (строковое имя пользователя, bool userIsOnline, bool
общедоступная абстрактная строка GetUserNameByEmail);
защищенный виртуальный void OnValidatingPassword (ValidatePasswordEventArgs e);
общедоступная
абстрактная строка ResetPassword (строка имени пользователя, строка ответа
)
;
public Abstract bool ValidateUser (строковое имя пользователя, строковый пароль);
// Свойства
public абстрактная строка ApplicationName ... { get; set; }
public абстрактное bool EnablePasswordReset ... { get; }
public абстрактное bool EnablePasswordRetrieval ... { get; }
public абстрактное int MaxInvalidPasswordAttempts ... { get }
public
;абстрактное int MinRequiredNonAlphanumericCharacters ... { get; }
public абстрактное int MinRequiredPasswordLength ... { get; }
public абстрактное int PasswordAttemptWindow ...
{ get; }public
абстрактное MembershipPasswordFormat PasswordFormat ... { get;
{получить; }
общедоступный абстрактный логический RequiresQuestionAndAnswer ... {получить;
общедоступный абстрактный логический RequiresUniqueEmail ... {получить;
// Поля
Private MembershipValidatePasswordEventHandler _EventHandler
Private const int SALT_SIZE_IN_BYTES = 0x10
;
Модификатор Internal — это несколько методов, которые являются вспомогательными методами для паролей, используемыми для шифрования, расшифровки и проверки паролей. Но здесь, похоже, есть некоторые проблемы с дизайном. Кажется немного неуместным определять эти методы как внутреннюю область. Эти методы определены в базовом классе, чтобы их можно было использовать повторно, но с точки зрения эффекта это так. Это не так, поскольку внутренние члены разрешено использовать только внутри этой сборки (при обычных обстоятельствах другие методы, такие как отражение, не включаются), а это означает, что наш собственный расширенный MembershipProvider не может использовать эти методы. И судя по текущей сфере применения, эти методы сейчас используются только в SqlMembershipProvider, поэтому я считаю, что эти модификаторы методов следует изменить на protected.
2. Статический класс членства
. Как упоминалось выше, в обычных обстоятельствах мы не будем напрямую использовать абстракцию MembershipProvider, поскольку она включает в себя проблему создания экземпляра реального класса службы членства и, как правило, включает настройку и создание экземпляров объектов. Все это относительно. сложные вопросы, и новичкам их нелегко освоить. В платформе .NET этот уровень сложных отношений защищен статическим классом Membership (Static Class). Помимо защиты пользователей от чтения файлов конфигурации, исходных объектов и других основных задач, членство (статический класс) также играет важную роль в перезагрузке всех MembershipProviders, поэтому существуют API, чтобы сделать его более удобным для использования пользователями. (Статический класс) также перезагружает эти методы Loaded как статический метод и предоставляет пользователям более широкие перегруженные реализации на основе базового API MembershipProvider. Это напрямую поддерживает независимо от того, находится ли он на уровне пользовательского интерфейса или в других проектах, просто обратитесь к пространству имен System.Web.Security, и вы сможете пользоваться различными удобствами, предоставляемыми членством, не беспокоясь о каких-либо деталях. Давайте взглянем на определение прототипа членства (статического класса): (Используйте .NET Reflector Лутца Родера для просмотра всех его реализаций.)
public static class Membership
...{
// События
public static event MembershipValidatePasswordEventHandler ValidatingPassword;
// Методы
static Membership();
public static MembershipUser CreateUser(строка имя пользователя, строка пароль);
public static MembershipUser CreateUser(строка имя пользователя, строка пароль, строка электронная почта
);
парольQuestion, строка пароляAnswer, bool isApproved, out MembershipCreateStatus status
)
;
public static bool DeleteUser (строкаusername
, bool deleteAllRelatedData);
public static MembershipUserCollection FindUsersByEmail (строка
emailToMatch
)
; Матч
;,
out int totalRecords);частная статическая строка GetCurrentUserName();
public static int GetNumberOfUsersOnline();
public static MembershipUser GetUser()
;public
static MembershipUser (bool userIsOnline)
;
GetUser (строка имени пользователя);
public static MembershipUser GetUser(
объектProviderUserKey, bool userIsOnline);
public static MembershipUser GetUser (string username, bool userIsOnline);
public
static string GetUserNameByEmail (строка emailToMatch);
(пользователь MembershipUser);
public static bool ValidateUser (строковое имя пользователя, строковый пароль);
// Свойства
public static string ApplicationName ... { get; set; }
public static bool EnablePasswordReset ... { get;
public
static bool EnablePasswordRetrival ... { get
;
static bool IsHashAlgorithmFromMembershipConfig ... { get; }
public static int MaxInvalidPasswordAttempts ... { get; }
publicstatic int MinRequiredNonAlphanumericCharacters ... { get; }
public static int MinRequiredPasswordLength ... { get }
public static int PasswordAttemptWindow ... { get; }
public static string PasswordStrengthRegularExpression ... { get; }
public static MembershipProvider Provider ...
{ get; }public
static MembershipProviderCollection
Provider ... { get
;int UserIsOnlineTimeWindow ... {получить }
// Поля
Private static bool s_HashAlgorithmFromConfig
;
частнаястатическая строка s_HashAlgorithmType;
частный
статический объект
s_InitializeException;
частный статический MembershipProvider s_Providers;
ОнлайнВремяОкно
;
}
Сказав это, я должен сказать несколько слов. В процессе изучения кода реализации членства (статического класса) вы можете обнаружить, что каждая перегрузка API Membersip в конечном итоге вызывает метод поставщика атрибута. Тип этого атрибута — тип MembershipProvider. Только когда вы это видите, вы это понимаете. может понять Давайте поймем важную роль MembershipProvider. Существует также атрибут Providers, который предназначен для получения всех классов обслуживания членства, настроенных в web.config. Все они являются статическими свойствами, но как они создаются? При вызове метода Membership.Initialize() каждый раз, когда вызываются эти два свойства, этот метод будет вызываться, чтобы определить, был ли инициализирован класс обслуживания, предоставленный Membership. Если нет, будет вызываться класс обслуживания конфигурации для чтения конфигурации. . содержимое для инициализации. На этом этапе вам, возможно, не составит труда понять, почему нам так легко пользоваться!
3. Введение и настройка использования SqlMembershipProvider
. Из приведенного выше введения вы сможете в общих чертах понять общую структуру членства, верно? (Если вы еще этого не сделали, возможно, вы еще не открыли .NET Reflector Лутца Родера для анализа кода его реализации или еще не поняли роль абстрактных классов). Несмотря ни на что, наша конечная цель — научиться его использовать.
Перед этим я сначала хочу представить два класса реализации MembershipProvider, представленные в платформе .NET: ActiveDirectoryMembershipProvider и SqlMembershipProvider (Откуда вы знаете эти два класса? Вы можете увидеть все унаследованные классы в разделе «Производные типы MembershipProvider»). Первый предоставляет базового пользователя. управление в Active Directory (я это не практиковал), причем последнее — это реализация управления пользователями на основе SqlServer, которую мы чаще всего используем.
Пришло время познакомить с тем, как его использовать. На самом деле, статьи на эту тему уже есть в саду ((Перевод) How to use Membership in ASP.NET 2.0), так что не буду больше тратить слова. Но здесь я хочу рассказать вам самый прямой способ изучения и использования его для справки. Найдите и откройте файл Machine.config на системном диске, найдите узел AspNetSqlMembershipProvider и посмотрите, сможете ли вы его увидеть. Фактически это самая базовая конфигурация членства, но в ней отсутствует спецификация атрибута defaultProvider. вы можете использовать контроль входа в систему, нет необходимости использовать какой-либо код для проверки входа пользователя. Если вы не верите, вы можете попробовать. (Что касается проверки форм, я не буду о ней здесь рассказывать. Вы можете обратиться к соответствующей информации. Для получения дополнительной информации о SqlMembershipProvider обратитесь к MSDN).
4. Как настроить MembershipProvider и другие существующие ресурсы MembershipProvider
Итак, как нам настроить MembershipProvider? На самом деле, если вы уже понимаете структуру Membership, я считаю, что для вас это не составит труда, однако, учитывая, что написать полный MembershipProvider — это еще определенный объем работы и сложности. Для нас больше мест может быть для расширения существующего Provider, такого как SqlMembershipProvider. На самом деле, это очень просто. Нам нужно всего лишь наследовать от SqlMembershipProvider (скажем так, в параметре конфигурации метода Initialize сохраняется имя и значение атрибута соответствующего раздела конфигурации Provider), а затем расширить и расширить его. перепишите необходимые методы. При его использовании в разделе «Конфигурация поставщика» измените значение типа на имя вашего класса, и все будет в порядке.
Наконец, на рынке уже существует множество MembershipProviders в разных средах, таких как mysql, Oracle и т. д. Вот реализация Mysql: http://www.codeproject.com/aspnet/mysqlmembershipprovider.asp . Я думаю, вы можете найти дополнительную помощь в Google.
Хорошо, я сказал слишком много, надеюсь, это может быть полезно для вас, кто потрудился прочитать этот блог. Спасибо^_*.