Подтвердить что ты не робот

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 и ничего больше?

Должен ли я сам написать всю обработку членства и логику аутентификации (генерация хэш-кода и т.д.)?

4b9b3361

Ответ 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);
}