Пользователи и роли семян MVC 5
Я играл с новым MVC 5, у меня есть несколько моделей, контроллер и представления настройки с помощью кода первой миграции.
мой вопрос заключается в том, как я могу сеять пользователей и роли? В настоящее время я заполняю некоторые справочные данные в своем методе Seed в конфигурации.цезий. Но мне кажется, что таблицы пользователей и ролей не создаются до тех пор, пока что-то не попадет в AccountController.
в настоящее время у меня есть две строки подключения, поэтому я могу отделить свои данные от моей аутентификации в разные базы данных.
Как я могу получить пользователей, ролей и т. д. таблицы заполните вместе с другим? И не тогда, когда контроллер учетной записи поражен?
6 ответов:
вот пример обычного семенного подхода:
protected override void Seed(SecurityModule.DataContexts.IdentityDb context) { if (!context.Roles.Any(r => r.Name == "AppAdmin")) { var store = new RoleStore<IdentityRole>(context); var manager = new RoleManager<IdentityRole>(store); var role = new IdentityRole { Name = "AppAdmin" }; manager.Create(role); } if (!context.Users.Any(u => u.UserName == "founder")) { var store = new UserStore<ApplicationUser>(context); var manager = new UserManager<ApplicationUser>(store); var user = new ApplicationUser {UserName = "founder"}; manager.Create(user, "ChangeItAsap!"); manager.AddToRole(user.Id, "AppAdmin"); } }я использовал package-manager "update-database". БД и все таблицы были созданы и заполнены данными.
Это небольшое дополнение, но для тех, кто имеет "UserId не найден."сообщение при попытке сеять: (у Тома Ригана был этот вопрос в комментариях, и я сам застрял на нем на некоторое время)
Это означает, что менеджер.Создать (пользователь, " ChangeItAsap!") не увенчалась успехом. Это может иметь другую причину, но для меня это было потому, что мой пароль не удалось его проверки.
У меня был пользовательский passwordvalidator, который не вызывался при заполнении база данных, поэтому правила проверки, к которым я привык (minlength 4 вместо default 6), не применялись. Убедитесь, что ваш пароль (и все другие поля в этом отношении) проходит проверку.
Это мой метод, основанный на ответе Валина, я добавил роли в БД и добавил пароль для пользователя. Этот код помещается в
Seed()метод в миграции > конфигурации.цезий.// role (Const.getRoles() return string[] whit all roles) var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); for (int i = 0; i < Const.getRoles().Length; i++) { if (RoleManager.RoleExists(Const.getRoles()[i]) == false) { RoleManager.Create(new IdentityRole(Const.getRoles()[i])); } } // user var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context)); var PasswordHash = new PasswordHasher(); if (!context.Users.Any(u => u.UserName == "[email protected]")) { var user = new ApplicationUser { UserName = "[email protected]", Email = "[email protected]", PasswordHash = PasswordHash.HashPassword("123456") }; UserManager.Create(user); UserManager.AddToRole(user.Id, Const.getRoles()[0]); }
здесь у меня есть очень простое,чистое и гладкое решение.
protected override void Seed(UserContext context) { //Step 1 Create the user. var passwordHasher = new PasswordHasher(); var user = new IdentityUser("Administrator"); user.PasswordHash = passwordHasher.HashPassword("Admin12345"); user.SecurityStamp = Guid.NewGuid().ToString(); //Step 2 Create and add the new Role. var roleToChoose = new IdentityRole("Admin"); context.Roles.Add(roleToChoose); //Step 3 Create a role for a user var role = new IdentityUserRole(); role.RoleId = roleToChoose.Id; role.UserId = user.Id; //Step 4 Add the role row and add the user to DB) user.Roles.Add(role); context.Users.Add(user); }
то, что я делаю, это создать еще один асинхронный этод и назвать его синхронно, работает идеально для меня.
protected override void Seed(ApplicationDbContext context) { Task.Run(async () => { await SeedAsync(context); }).Wait(); } private async Task SeedAsync(ApplicationDbContext context) { var userManager = new ApplicationUserManager(new UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>(context)); var roleManager = new ApplicationRoleManager(new RoleStore<ApplicationRole, int, ApplicationUserRole>(context)); if (!roleManager.Roles.Any()) { await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AdminRoleName }); await roleManager.CreateAsync(new ApplicationRole { Name = ApplicationRole.AffiliateRoleName }); } if (!userManager.Users.Any(u => u.UserName == "shimmy")) { var user = new ApplicationUser { UserName = "shimmy", Email = "[email protected]", EmailConfirmed = true, PhoneNumber = "0123456789", PhoneNumberConfirmed = true }; await userManager.CreateAsync(user, "****"); await userManager.AddToRoleAsync(user.Id, ApplicationRole.AdminRoleName); } }
похоже, они меняют способ аутентификации в MVC5, изменили мой глобальный.асакс.CS в следующем сделали свое дело!
using System.Web.Mvc; using System.Web.Optimization; using System.Web.Routing; using System.Threading.Tasks; using MvcAuth.Models; using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.Owin; using System.Threading; using Microsoft.AspNet.Identity.EntityFramework; namespace MvcAuth { public class MvcApplication : System.Web.HttpApplication { async Task<bool> AddRoleAndUser() { AuthenticationIdentityManager IdentityManager = new AuthenticationIdentityManager( new IdentityStore(new ApplicationDbContext())); var role = new Role("Role1"); IdentityResult result = await IdentityManager.Roles.CreateRoleAsync(role, CancellationToken.None); if (result.Success == false) return false; var user = new ApplicationUser() { UserName = "user1" }; result = await IdentityManager.Users.CreateLocalUserAsync(user, "Password1"); if (result.Success == false) return false; result = await IdentityManager.Roles.AddUserToRoleAsync(user.Id, role.Id, CancellationToken.None); return result.Success; } protected async void Application_Start() { AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); bool x = await AddRoleAndUser(); } } }
Comments