Ответ 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, поэтому оно помогает понять немного об этом.
- codeplex source (зеркальное отображение в github).
-
WebSecurity
-
OAuthWebSecurity
-
SimpleMembershipProvider
-
ExtendedMembershipProvider
-
SimpleRoleProvider
-
Membership
-
Roles
-
DbContext
и API DbContext
РЕДАКТИРОВАТЬ Сноска: подробная информация о выполнении обновления пароля для обновления
- Добавить свойство в
UserProfile
, в котором хранится какая версия пароля, на которой установлена учетная запись (например, 1 для наследия, 2 для SimpleMembership). - В действии "Войти" напишите код так, чтобы:
- Если они находятся в вашей версии пароля SimpleMembership, вы делаете обычный вход
- Если они находятся в старой версии пароля, вы:
- проверьте его, используя старый метод
- если это правильно, вы reset с помощью
ResetPassword
, затемChangePassword
, чтобы использовать версию SimpleMembership, это обновит поле до новой версии пароля - и, наконец, обновить версию пароля на
UserProfile
- Обновите любые другие методы AccountsController, которые используют пароль аналогичным образом.
- Живите с помощью взломанного обходного пути и связи с таблицей
webpages_Membership
, которую мы не должны касаться, поскольку вам не нужно было писать новый пользовательский поставщик.
Все транзакционные транзакции можно выполнить с помощью TransactionScope
. Единственная неприятная вещь - дополнительный код в контроллере и связь с webpages_Membership
.