SimpleMembership с пользовательской схемой базы данных в ASP.NET MVC 4
Я хочу включить ASP.NET MVC 4 SimpleMembership API для интеграции с моей собственной схемой базы данных. У меня есть простая и простая таблица в моей базе данных под названием Users
с этими полями:
- Id
- Имя
- Пароль
- Email
- IsDeleted
Я уже настроил SimpleMembership API для использования моей базы данных:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: true);
И я тоже могу вставить пользователя:
WebSecurity.CreateUserAndAccount(model.UserName, model.Password,
new
{
IsDeleted = false,
Email = "[email protected]"
});
Однако поле "Пароль" (или хеш) не вставлено в таблицу "Пользователи" (конечно), оно вставлено в другую таблицу с именем webpages_Membership
, которая создается с вызовом InitializeDatabaseConnection
и содержит много ненужной информации которые мне не нужны.
Кроме того, у меня есть другие автоматически созданные таблицы, называемые webpages_OAuthMembership, webpages_Roles и webpages_UsersInRoles, которые мне не нужны.
Я уже пытался установить для генерации таблицы значение false:
WebSecurity.InitializeDatabaseConnection("MyStuff", "Users", "Id", "Name", autoCreateTables: false);
Но в этом случае вызов CreateUserAndAccount вызовет исключение, потому что он не найдет таблицу webpages_Membership.
Похоже, эти таблицы нужны, когда я хочу использовать SimpleMembership API.
Мой вопрос в том, что: что мне делать в таком сценарии, когда я хочу только простую таблицу Users
и ничего больше?
Должен ли я сам написать всю обработку членства и логику аутентификации (генерация хэш-кода и т.д.)?
Ответы
Ответ 1
Я задал тот же вопрос группе продуктов.
Целью проекта в SIMPLE-членстве было максимально упростить работу как можно проще.
Так что на самом деле нет никакой возможности настройки в отношении таблиц.
Рекомендуемым обходным решением является использование членства ASP.NET(SqlMembershipProvider).
Ответ 2
Возможно изменение настроек.
Вы можете получить исходный код SimpleMembershipProvider из aspnetwebstack проект на CodePlex, так как именно здесь происходит сопоставление между схемой DB и средой выполнения, вы можете изменить этот код, чтобы изменить/заменить схему, инструкции и т.д. в соответствии с вашими потребностями (без большой головной боли, IMO.)
Ответ 3
1 - Необходимо включить миграцию, предпочтительно с EntityFramework 5. Используйте Enable-Migrations
в диспетчере пакетов NuGet.
2 - Переместите
WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "EmailAddress", autoCreateTables: true);
к вашему методу Seed в классе YourMvcApp/Migrations/Configuration.cs
protected override void Seed(UsersContext context)
{
WebSecurity.InitializeDatabaseConnection(
"DefaultConnection",
"UserProfile",
"UserId",
"UserName", autoCreateTables: true);
if (!Roles.RoleExists("Administrator"))
Roles.CreateRole("Administrator");
if (!WebSecurity.UserExists("lelong37"))
WebSecurity.CreateUserAndAccount(
"lelong37",
"password",
new {Mobile = "+19725000000", IsSmsVerified = false});
if (!Roles.GetRolesForUser("lelong37").Contains("Administrator"))
Roles.AddUsersToRoles(new[] {"lelong37"}, new[] {"Administrator"});
}
Теперь EF5 будет отвечать за создание вашей таблицы UserProfile, после этого вы вызовите WebSecurity.InitializeDatabaseConnection, чтобы зарегистрировать SimpleMembershipProvider с уже созданной таблицей UserProfile, а также рассказать SimpleMembershipProvider, какой столбец UserId и UserName. Я также показываю пример того, как вы можете добавлять пользователей, роли и связывать их в методе Seed с пользовательскими свойствами/полями UserProfile, например. пользователя Mobile (number).
3 - Теперь, когда вы запускаете базу данных обновлений из Консоли диспетчера пакетов, EF5 предоставит вашей таблице все ваши пользовательские свойства.
Дополнительные ссылки см. в этой статье с исходным кодом:
http://blog.longle.io/2012/09/25/seeding-users-and-roles-with-mvc4-simplemembershipprovider-simpleroleprovider-ef5-codefirst-and-custom-user-properties/
Ответ 4
Вы можете использовать OAUth с ASP.NET Universal Providers. универсальные поставщики - это новая версия поставщиков sqlmembership. они основаны на EF CodeFirst и также создают более чистую схему вашей базы данных
посмотрите на мое следующее сообщение для более подробной информации
http://blogs.msdn.com/b/pranav_rastogi/archive/2012/09/12/integrate-openauth-openid-with-your-existing-asp-net-application-using-universal-providers.aspx
Ответ 5
Это может не работать для вашего случая использования, но, конечно, вы можете легко добавить свои пользовательские атрибуты в таблицу SimpleMembership UserProfile вместо создания другой таблицы пользователей
Я бы рекомендовал использовать существующую таблицу членства, чтобы сохранить хешированный пароль, и просто игнорировать поля, которые вам не нужны. Таким образом поддерживается без проблем с совместимостью с SimpleMembership.
SQLMembership очень просто из коробки. Я сделал обширные индивидуальные расширения для SQLMembership в нескольких проектах, что было не так сложно, но, оглядываясь назад, я бы этого не хотел. Это своего рода хлопот обслуживания,
Ответ 6
Вы можете создать своего собственного поставщика членства, расширив членство. Подробнее см. Custom MembershipProvider в .NET 4.0. Используя этот подход, вам нужно будет только реализовать методы, которые вам нужны. Это должно помочь сделать вещи более простыми и не потребует от вас добавления таблиц, которые вам не нужны.
Основные шаги (взятые из связанного ответа SO):
- Создайте новый файл класса (если вы не используете многоуровневую систему в папке "Модели проектов" ), позвоните в MyMembershipProvider.cs
- Наследовать этот класс из System.Web.Security.MembershipProvider
- Автоматически создавать необходимые методы (период + пробел в классе inherit)
Ответ 7
Вы можете использовать как таблицу пользовательских пользователей, так и таблицы SimpleMembership. Этот метод отлично работал у меня в прошлом.
Например, в вашем методе Register в AccountController вы зарегистрируете нового пользователя, добавив пользователя в свою собственную таблицу Users. Затем добавьте этого пользователя в таблицу UserProfile SimpleMembership, используя идентификатор пользователя, добавленного в таблицу Users.
using (var context = new MyDatabaseEntities())
{
User newUser = new User(){
Name = model.Name,
Email = model.Email,
IsDeleted = false
}
// Add the user to your custom Users table
context.Users.Add(newUser);
context.SaveChanges();
// Add this user to the SimpleMembership table using the same Id as the custom Users table
WebSecurity.CreateUserAndAccount(newUser.Id.ToString(), model.Password);
// Log the user in
WebSecurity.Login(newUser.Id.ToString(), model.Password);
}