Как использовать мою собственную базу данных с SimpleMembership и WebSecurity? Что такое безопасность MVC4?

Я прочитал все в этой теме, которую я мог найти, включая статьи MSDN и сообщения SO, но я все еще очень потерян и смущен.

Вопросы

Пожалуйста, ответьте на следующее (кратко, если это возможно):

  • Что такое SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData) и за что они/несут ответственность?

  • Что такое WebSecurity (WebMatrix.WebData)?

  • Что такое класс Членство (System.Web.Security)?

  • Почему MVC4 создает таблицу UserProfile и таблицу webpages_Membership? Для чего они нужны и в чем разница? Что такое класс UserProfile, который создает MVC4?

  • Что такое класс UsersContext?

  • Как все они работают вместе, чтобы выполнить аутентификацию пользователя?

Мое положение

Эти вопросы затем приводят к следующей проблеме:

Предположим, у меня есть существующая база данных с пользователями (идентификаторы, имена пользователей, пароли). Я создаю новое приложение MVC4 и используя проверку подлинности с помощью форм. Пользовательские пароли хранятся в базе данных в зашифрованном виде (не bcrypt).

Что мне нужно сделать, чтобы он работал с MVC4?

Нужно ли создавать пользовательский MemberhipProvider?

Мои знания До сих пор

Насколько я понимаю, WebSecurity - это статический класс (Module), который взаимодействует с MembershipProvider. MemberhipProvider - это класс, который объясняет, как работают определенные функции, такие как ValidateUser, CreateUser, ChangePassword.

Чтобы решить мою проблему, я предполагаю, что мне нужно создать собственный MemberhipProvider и сообщить WebSecurity, чтобы использовать мой новый MemberhipProvider.

Баунти?

Я поставил щедрость на этот вопрос и намерен присудить его Энди Брауну за выдающийся ответ.

Ответ 1

См. краткие описания каждой цитаты для быстрого ответа и параграфы для подробностей. Также см. Раздел "Ссылки" в конце для авторитетных источников.

Резюме

1.Что такое SimpleMembership/SimpleMembershipProvider (WebMatrix.WebData) и за что они/несут ответственность?

SimpleMembership (термин, который охватывает как SimpleMembershipProvider, так и SimpleRoleProvider) отвечает за предоставление чистого и быстрого способа реализации 80% -й схемы проверки подлинности и авторизации plug and play с безопасным хранением паролей, которые любой может использовать.

2. Что такое WebSecurity (WebMatrix.WebData)?

WebSecurity является вспомогательным классом для общих задач членства, который работает вместе с Membership и OAuthWebSecurity. Роли по-прежнему доступны отдельно через Roles.

3.Какой класс Membership (System.Web.Security)?

Membership является статическим классом из первоначальной реализации членства ASP.NET, которая управляет настройками и операциями пользователя. Многие операции пользователя все еще выполняются здесь, а не повторяются в WebSecurity. Они оба используют одного и того же поставщика по вашему выбору.

4. Почему MVC4 создает таблицу UserProfile и таблицу webpages_Membership? Для чего они нужны и в чем разница? Что такое класс UserProfile, который создает MVC4?

Две таблицы выполняют разные функции. Схема webpages_Membership управляется каркасом и используется для учетных данных, схема UserProfile контролируется нами и используется для любых свойств, которые мы хотим сохранить против пользователя.

5.Какой класс UsersContext?

Это DbContext (часть DbContext API), который предоставляется в качестве запуска с помощью шаблона интернет-приложения MVC. Его единственное задание состоит в том, чтобы содержать класс UserProfile, чтобы мы могли работать с ним (например, через InitializeSimpleMembershipAttribute).

6. Как все они работают вместе, чтобы выполнить аутентификацию пользователя?

Это должно быть очевидно из приведенных выше итогов и ниже. Использовать: WebSecurity для обычных задач; UserProfile для пользовательских свойств для хранения против пользователя, доступ к которым осуществляется через UsersContext (в шаблоне Visual Studio "MVC Internet Application" ); Membership, когда WebSecurity или OAuthWebSecurity не имеет метода; и Roles для ролей. Используйте шаблонный контроллер VS, чтобы увидеть примеры использования.

Edit. В случае, если кто-то получил это далеко

Предположим, что у меня есть существующая база данных...

Если у вас есть существующая база данных, и ваша единственная причина для написания пользовательского провайдера членства заключается в том, чтобы иметь дело с вашим устоявшимся способом хранения паролей, вы можете использовать обходной путь. Это будет работать, только если вы можете отойти от старого хранилища паролей к алгоритму SimpleMembership (который использует класс Rfc2898DeriveBytes). Подробнее см. В сноске.

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

ПРИМЕЧАНИЕ: SimpleMembershipProvider будет УКАЗЫВАЕТ ваши пароли, а не ENCRYPT их. Если вы не знаете разницу и почему это важно, подумайте дважды, прежде чем делать свой собственный провайдер с пользовательской безопасностью


Деталь

1.Что такое SimpleMembership/SimpleMembershipProvider

Чтобы понять, как все это сочетается, это помогает понять историю.

  • ASP.NET в 2005 году внедрил систему членства ASP.NET
  • Эта система использовала поставщиков для абстрагирования деталей реализации от общих интерфейсов, используемых для управления учетными записями и ролями и т.д.
  • Он также дал нам базовую возможность "пользовательского профиля" (хранящуюся в одном столбце xml-поля, которое, как правило, избегали люди)
  • SimpleMembership был выпущен в мире в 2010 году как поставщик, который подключается к системе членства ASP.NET, но также позволяет использовать аутентификацию OAuth и хранилище профилей пользователя для каждого столбца (вместо использования одного хранилища столбцов в исходной реализации).
  • SimpleMembershipProvider реализует ExtendedMembershipProvider для расширения исходная реализация поставщика

Это открытый исходный код codeplex (зеркальное отображение on github). Что касается безопасности, вы можете оценить код самостоятельно, клонировать его, изменять его и т.д. Вы должны взять свой собственный вид на преимущества и недостатки безопасность с открытым исходным кодом, и приготовить это с помощью щепотка NIH. (Личный взгляд: я иногда использую его, я не использую его по-другому)

ExtendedMembershipProvider сам по себе добавляет команды типа GeneratePasswordResetToken к старому провайдеру членства apis.

2. Что такое WebSecurity (WebMatrix.WebData)?

WebSecurity - это просто фасад или вспомогательный класс, чтобы обеспечить простой доступ к SimpleMembershipProvider и сделать простые задачи легкими и доступными в одно место. Это помогает и потому, что расширение исходного фрейма через ExtendedMembershipProvider означает, что некоторые из исходных классов, таких как Membership, недостаточно. Примеры:

  • WebSecurity.CurrentUserName - получает имя текущего зарегистрированного пользователя
  • WebSecurity.CreateUserAndAccount. Одновременно создайте пользователя и задайте свойства профиля пользователя (например, WebSecurity.CreateUserAndAccount(userName, pw, new { Email = model.Email });
  • WebSecurity.InitializeDatabaseConnection - Быстрая настройка новой/существующей базы данных для использования с членством, выбор столбца идентификатора пользователя и идентификатора пользователя с естественным ключом и т.д.
  • ResetPassword - reset пароль пользователя, GeneratePasswordResetToken и многое другое

Эти методы обычно относятся к провайдеру, которого вы используете, они не просто зависят от SimpleMembership, но и объединяют объекты, такие как ваш провайдер, и Membership, чтобы обеспечить общую точку для выполнения функций членства.

Обратите внимание, что существует также OAuthWebSecurity, что эквивалентно WebSecurity для аутентификации OAuth.

3. Что такое класс членства (System.Web.Security)?

Membership - из первоначальной реализации; он управляет пользовательскими настройками и выполняет связанные с пользователем операции, используя базовую реализацию MembershipProvider, которую теперь расширяет ExtendedMembershipProvider. Это статический класс, поэтому он доступен везде, где вы объявляете пространство имен, и поэтому является простым способом, например, для извлечения текущего пользователя: Membership.GetUser

Существует путаница, вызванная тем, что WebSecurity выполняет некоторые вещи, а не другие, а Membership выполняет некоторые вещи, а не другие. Если вы просмотрите WebSecurity как инструментарий для операций более высокого уровня и Membership в качестве инструментария для того, чтобы делать что-то для пользователя, вы будете в порядке; они работают вместе с вашим провайдером.

4. Почему MVC4 создает таблицу UserProfile и таблицу webpages_Membership? Для чего они нужны и в чем разница? Что такое класс UserProfile, который создает MVC4?

  • webpages_Membership - это таблица с фиксированной схемой, которую мы оставляем в покое, и позволяет провайдеру выполнять основные операции с учетной записью, главным образом сохраняя учетные данные.
  • UserProfile - это таблица, которую мы настраиваем для хранения информации против учетной записи пользователя, и предоставляем ее в строго типизированном формате через класс UserProfile.
  • Существует дополнительная таблица под названием webpages_OAuthMembership, которая выполняет ту же работу, что и webpages_Membership, но для поставщиков логинов OAuth, с которыми вы хотите интегрироваться.

Магия этой установки заключается в том, что у одного пользователя может быть членский вход на вашем собственном сайте, и любое количество логинов OAuth с разными поставщиками, такими как google, facebook, и все они имеют общий профиль, хранящийся в UserProfile

Обычно, если таблица начинается с webpages_, это означает, что для доступа к ней есть API. Таблица UserProfile представлена ​​классом UserProfile в вашем UsersContext (если вы используете шаблон интернет-приложения MVC по умолчанию). Поэтому мы получаем доступ к этому с помощью обычных методов, которые мы будем использовать с любым классом, содержащимся в DbContext.

UserProfile очень удобен для кода: вы можете добавлять столбцы (например, адрес пользователя Email), а затем настраивать миграцию, чтобы включить этот столбец в свою базу данных в следующую версию (если вам нравится использовать миграции). Фактически, таблица UserProfile не должна вызываться так: вы можете изменить ее, используя вызов WebSecurity.InitializeDatabaseConnection, [Table("UserProfile")] public class UserProfile и свои собственные миграции.

5.Какой класс UsersContext?

Это из шаблона интернет-приложения MVC, представленного в Visual Studio New Project. Первое, что я делаю, это убедиться, что он имеет общую строку соединения с моим собственным контекстом базы данных (при условии, что таблицы членства находятся в одной базе данных). Вы можете изменить это и отделить их позже, если хотите.

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

Литература:

Использование SimpleMembership с веб-страницами ASP.NET - Мэтью Осборн - Это оригинальная ссылка на SimpleMembership, и что это такое, почему она и что она делает:

MSDN - введение в членство - Членство по-прежнему остается основой SimpleMembership, поэтому оно помогает понять немного об этом.


РЕДАКТИРОВАТЬ Сноска: подробная информация о выполнении обновления пароля для обновления

  • Добавить свойство в UserProfile, в котором хранится какая версия пароля, на которой установлена ​​учетная запись (например, 1 для наследия, 2 для SimpleMembership).
  • В действии "Войти" напишите код так, чтобы:
    • Если они находятся в вашей версии пароля SimpleMembership, вы делаете обычный вход
    • Если они находятся в старой версии пароля, вы:
      • проверьте его, используя старый метод
      • если это правильно, вы reset с помощью ResetPassword, затем ChangePassword, чтобы использовать версию SimpleMembership, это обновит поле до новой версии пароля
      • и, наконец, обновить версию пароля на UserProfile
  • Обновите любые другие методы AccountsController, которые используют пароль аналогичным образом.
  • Живите с помощью взломанного обходного пути и связи с таблицей webpages_Membership, которую мы не должны касаться, поскольку вам не нужно было писать новый пользовательский поставщик.

Все транзакционные транзакции можно выполнить с помощью TransactionScope. Единственная неприятная вещь - дополнительный код в контроллере и связь с webpages_Membership.