在“迁移配置”类中,有“种子”方法,它看起来像:
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");
}
}
}
然后在PM控制台中,我运行了update-database,它成功地为数据库添加了种子,在表AspNetUserRoles中,我可以看到用户someUserName和Administrator角色已连接。
但是,当我将属性[Authorize(Roles = "Administrator")]
放在控制器上方时,我已被重定向到登录页面,就好像我的用户没有担任该角色一样,因此我在控制器中添加了以下行:
var x = _userManager.IsInRole(_userManager.FindByName("someUserName").Id, "Administrator");
x是错误的。为什么会这样呢?我该如何解决?如果这不是种数据库的正确方法,那是?
尝试您的种子方法
context.Configuration.LazyLoadingEnabled = true;
这是我对禁用延迟加载时的情况的猜测,当UserManager或UserStore访问该对象时,IdentityUser
/ApplicationUser
对象的Roles属性为null或为空,因为该集合未手动加载。然后,该代码继续进行,就像实际上从未从未加载过集合一样,没有将角色分配给用户一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句