2009-03-09 2 views
8

Я храню данные пользователя в таблице MSSQL под названием «Пользователи». Я хочу иметь доступ к всем пользовательским данным для фактически зарегистрированного пользователя (адрес электронной почты, адрес, телефон, если пользователь является подписчиком и т. Д.).Членство, MembershipProvider и MembershipUser отношения в ASP.NET?

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

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

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

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

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

ответ

8

Хотя это не кристально чистое on MSDN, это еще не все так сложно. Существует три категории:

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

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

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

Это, надеюсь, вы уверены, что не хотите use Profiles, и действительно хотите иметь отдельную таблицу пользователей. Если вы пишете внутреннее приложение, использование существующего хранилища данных Active Directory или LDAP уменьшит административные расходы и, возможно, риски безопасности. Есть сотни вещей, которые вы можете легко сделать неправильно при переходе на маршрут MembershipProvider. Вы используете salted hashes? Как вы защищаете таблицу User от манипуляции? MSDN охватывает только часть security issues, с которой вы можете столкнуться.

+0

Спасибо, это очень помогает. теперь я понимаю. Это проще, чем кажется. Большое спасибо. –

1

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

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