2013-12-09 52 views
5

迁移中配置类,还有种方法,它看起来像:ASP.net MVC + ASP.net身份播种角色和用户

protected override void Seed(DatabaseContext context) 
     { 
      var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context)); 
      var userManager = new UserManager<User>(new UserStore<User>(context)); 

      if (!roleManager.RoleExists("Administrator")) 
      { 
       roleManager.Create(new IdentityRole("Administrator")); 
      } 

      var user = new User {UserName = "someUserName"}; 


      if (userManager.FindByName("someUserName") == null) 
      { 
       var result = userManager.Create(user, "password"); 

       if (result.Succeeded) 
       { 
        userManager.AddToRole(user.Id, "Administrator"); 
       }  

      } 
      } 

然后在下午控制台我已经运行更新数据库,并且它成功播种了数据库,并且在表AspNetUserRoles中,我可以看到用户someUserName和Administrator角色已连接。

但是当我把属性[Authorize(Roles = "Administrator")]上述控制器我被重定向到登录页面,就好像我的用户在那个角色是不是,所以我在我的控制器中加入一行:

var x = _userManager.IsInRole(_userManager.FindByName("someUserName").Id, "Administrator"); 

而且x是错误的。这是为什么发生?我该如何解决它?如果这不是种子数据库的正确方法,那是什么?

回答

7

尝试在种子法

context.Configuration.LazyLoadingEnabled = true; 

这是我在什么时候延迟加载禁用要去猜测,该IdentityUser/ApplicationUser对象的角色属性为null或空当的UserManager或UserStore访问它因为该集合没有被手动加载。然后代码继续进行,就像没有角色已经分配给用户,事实上该集合从未加载过。

0

尝试

context.SaveChanges(); 

在种子方法的结束。