Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

При этом я надеюсь, что вы уверены, что не хотите использовать профили, и очень хочу иметь отдельную таблицу пользователей.Если вы пишете внутреннее приложение, используя существующее Активный каталог или ЛДАП-включенное хранилище данных снизит затраты на администрирование и, возможно, риски безопасности.Есть сотни вещей, которые вы можете легко сделать неправильно, выбирая путь MembershipProvider.Вы используете соленые хеши?Как вы защищаете таблицу User от манипуляций?MSDN охватывает лишь часть проблемы с безопасностью вы можете столкнуться.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top