Членство, членствоПоставщик и членствоПользователь отношения в ASP.NET? - PullRequest
8 голосов
/ 10 марта 2009

Я храню данные пользователя в таблице MSSQL под названием Users. Я хочу, чтобы были доступны все данные пользователя для фактически зарегистрированного пользователя (электронная почта, адрес, телефон, если пользователь является подписчиком и т. Д.).

Я не хочу использовать профили, поэтому я решил использовать пользовательский MembershipProvider (или вы знаете какой-то лучший, менее болезненный способ?).

Что я не понимаю, так это MembershipUser и Membership. Если я наследую от MembershipProvider, в переопределенных методах я управляю доступом к данным из базы данных и в нее.

Но как мне использовать унаследованный класс от MembershipProvider? Если я хочу аутентифицировать пользователя, используя членство, я должен сделать:

if(Membership.ValidateUser(string username, string password))
{
   FormsAuthentication.RedirectFromLoginPage(string username, string password);
}

Но где класс наследуется от MembershipProvider? А когда использовать класс, унаследованный от MembershipUser? И какова связь между членством и MembershipProvider?

Ответы [ 2 ]

8 голосов
/ 10 марта 2009

Хотя на MSDN это не совсем ясно , это не так уж сложно. Есть трио классов:

  • Членство: предоставляет служебные методы и точку входа - в основном Singleton (статический класс).
  • MembershipProvider: действует как средство доступа к данным и фабрика для объектов MembershipUser.
  • MembershipUser: представляет отдельного пользователя.

Пользовательский MembershipProvider выбирается (по коду в Membership) на основе конфигурации вашего приложения: configuration / system.web / members. Здесь вы вводите своего провайдера в игру. Ваша реализация MembershipProvider должна быть написана для доступа к любому хранилищу данных, которое вы предпочитаете для пользователей: к вашей таблице User в этом случае.

Объекты MembershipUser создаются только через вашего MembershipProvider. Метод MembershipProvider.ValidateUser () должен проверить по вашему хранилищу данных, что комбинация пользователя и пароля действительна. MembershipProvider.GetUser () получает информацию о пользователе - используйте ее на защищенной странице доступа и передайте System.Web.HttpContext.Current.User.Identity.Name в качестве текущего аутентифицированного пользователя.

При этом я надеюсь, что вы уверены, что не хотите использовать профили и действительно хотите иметь отдельную таблицу пользователей. Если вы пишете внутреннее приложение, использование существующего хранилища данных с поддержкой Active Directory или LDAP уменьшит расходы на администрирование и, возможно, риски для безопасности. Существуют сотни вещей, которые вы легко можете сделать неправильно, если будете идти по маршруту MembershipProvider. Используете ли вы соленые хэши ? Как вы защищаете таблицу пользователей от манипуляций? MSDN охватывает только часть проблем безопасности , с которыми вы можете столкнуться.

1 голос
/ 10 марта 2009

Конкретный используемый поставщик контролируется в web.config. Вы можете установить более одного провайдера и иметь одного по умолчанию. Проверить: http://msdn.microsoft.com/en-us/library/6e9y4s5t.aspx.

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

...