2014-09-21 126 views
4

我想通过MVC5为代码优先迁移和OWIN标识2授予用户和角色种子。升级到2.0之前,我有这个工作。如何通过使用OWIN标识2和MVC5代码优先进行种子用户和角色

首先,从IdentityConfig.cs文件中使用非代码第一迁移例如当DropCreateDatabaseIfModelChanges

的ApplicationDbInitializer级以下工作:

public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> 
{ 
    protected override void Seed(ApplicationDbContext context) 
    { 
     InitializeIdentityForEF(context); 
     base.Seed(context); 
    } 


    public static void InitializeIdentityForEF(ApplicationDbContext db) 
    { 
     var userManager = HttpContext 
      .Current.GetOwinContext() 
      .GetUserManager<ApplicationUserManager>(); 

     var roleManager = HttpContext.Current 
      .GetOwinContext() 
      .Get<ApplicationRoleManager>(); 

     const string name = "[email protected]"; 
     const string password = "[email protected]"; 
     const string roleName = "Admin"; 

     //Create Role Admin if it does not exist 
     var role = roleManager.FindByName(roleName); 

     if (role == null) 
     { 
      role = new IdentityRole(roleName); 
      var roleresult = roleManager.Create(role); 
     } 

     var user = userManager.FindByName(name); 

     if (user == null) 
     { 
      user = new ApplicationUser { UserName = name, Email = name }; 
      var result = userManager.Create(user, password); 
      result = userManager.SetLockoutEnabled(user.Id, false); 
     } 

     // Add user admin to Role Admin if not already added 
     var rolesForUser = userManager.GetRoles(user.Id); 

     if (!rolesForUser.Contains(role.Name)) 
     { 
      var result = userManager.AddToRole(user.Id, role.Name); 
     } 
    } 
} 

我感动InitializeIdentityForEF代码到我的configuration.cs文件并成功添加了这两个引用和项目构建。

using Microsoft.AspNet.Identity.Owin; 
using Microsoft.AspNet.Identity; 

,但我得到以下错误,当我从包管理器控制台运行更新的数据库:

System.NullReferenceException:对象不设置到对象的实例。 在System.Web.HttpContextExtensions.GetOwinEnvironment(HttpContext的背景下) 在System.Web.HttpContextExtensions.GetOwinContext(HttpContext的背景下)

更新

每OdeToCode评论,你不能使用OWIN包管理器控制台: 看看第51行这里:raw.githubusercontent.com/OdeToCode/MVC5_Samples/master/...我不认为你会在Seed方法中使用Owin成功,除非你在应用程序内运行Seed。如果您从包管理器控制台运行Seed,Owin将不在或未配置。 - OdeToCode 5月13日15:00

solution有希望,但是在构建具有以下错误:

错误4类型“Foo.Models。 ApplicationUser'不能用作通用类型或方法'Microsoft.AspNet.Identity.EntityFramework.UserStore'中的类型参数'TUser'。没有从'Foo.Models.ApplicationUser'到'Microsoft.AspNet.Identity.EntityFramework.IdentityUser'的隐式引用转换。 C:\ FOO \迁移\ Configuration.cs 86 43

protected override void Seed(Repository.DataContext.IdentityDb context) 
    var roleStore = new RoleStore<IdentityRole>(context); 
    var roleManager = new RoleManager<IdentityRole>(roleStore); 
    var userStore = new UserStore<ApplicationUser>(context); 
    var userManager = new UserManager<ApplicationUser>(userStore);    
    var user = new ApplicationUser { UserName = "sallen" }; 

    userManager.Create(user, "password");      
    roleManager.Create(new IdentityRole { Name = "admin" }); 
    userManager.AddToRole(user.Id, "admin"); 
} 
+1

所以,你解决了你的问题? – trailmax 2014-09-21 19:09:52

+1

我遇到同样的问题。你找到解决方案吗? – 2014-10-28 22:42:21

回答

0

从亡羊补牢版... 更好的晚间新闻,如果你有

var userManager = new ApplicationUserManager(new UserStore(context));

一切替换

var userStore = new UserStore<ApplicationUser>(context); 
var userManager = new UserManager<ApplicationUser>(userStore); 

应该管用。我注意到

0

在我来说,什么工作在这里给出的思路:

http://www.codeproject.com/Articles/674760/Code-First-Migration-and-Extending-Identity-Accoun

我取代这段代码在种方法:

 var userManager = HttpContext 
      .Current.GetOwinContext() 
      .GetUserManager<ApplicationUserManager>(); 

     var roleManager = HttpContext.Current 
      .GetOwinContext() 
      .Get<ApplicationRoleManager>(); 

这一个:

 var conText = new ApplicationDbContext(); 
     var userStore = new UserStore<ApplicationUser>(conText); 
     var userManager = new UserManager<ApplicationUser>(userStore); 

     var roleStore = new RoleStore<IdentityRole>(conText); 
     var roleManager = new RoleManager<IdentityRole>(roleStore); 
相关问题