我最近开始使用MVC和实体框架的新项目(全新的自己)。在我的应用程序中,我有两种类型的用户,管理员和非管理员。
我已在种子方法下的configuration.cs文件中将管理员播种到我的数据库中:
var userStore = new UserStore<Users>(context);
var userManager = new ApplicationUserManager(userStore);
var admin1 = new Users
{
UserName = "admin@email.com"
};
userManager.Create(admin1, "password");
AddUserAndRole(context, userManager, admin1);
AddUserAndRole方法:
bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user)
{
IdentityResult ir;
var rm = new RoleManager<IdentityRole>
(new RoleStore<IdentityRole>(context));
ir = um.Create(new IdentityRole("canEdit"));
ir = um.AddToRole(user.Id, "canEdit");
return ir.Succeeded;
}
迁移并运行解决方案后,我检查了AspNetUserLogins表,以确保用户的ID已成功与新的声明角色相关联,但由于某种原因,它未更新,但是当我查看AspNetRoles表时,声明会被添加到与创建的admin1无关的ID旁边。
想知道是否有人可以指出我出错的地方。
提前感谢您的帮助,如果我错过了这篇文章中的任何必要信息,请通知我。 :)
答案 0 :(得分:1)
您将安全概念与事物的外观混合在一起。
这里有很多事情,这些典型的“简化”解释是......
用户=可以登录的人 Login =用户的一组凭据
角色=将用户和权限组合在一起
Claim =声明提供商关于用户的说法
从这个问题来看,当你看起来只有两个简单的角色(用户和管理员)时,你似乎混合了基于声明的auth和基于角色的身份验证
基本上选择基于声明的身份验证或基于角色的身份验证,并使用其中一个,除非你真的需要复杂性,在这种情况下,你有大约3个月的最低阅读价值,并且让你全面了解所有这些。
总之我会...
创建用户,将用户添加到角色,然后使用基于角色的身份验证,直到您需要超越它为止。
var adminUser = new Users
{
UserName = "admin@email.com",
Roles = new [] { "Admins", "Users" }
};
userManager.Create(adminUser);
答案 1 :(得分:0)
@War关于角色和声明的说法非常正确,但是:
表AspNetRoles包含两列:
ID:角色的ID,而不是用户
名称:角色的名称
相反,您应该查看表AspNetUserRoles,它将用户ID链接到角色ID(列UserID和RoleId)
但你还有另一个问题:
每次尝试将用户分配到&#34; canEdit&#34;时,您都在创建一个新角色。这就是为什么每次都在AspNetRoles中获得新条目的原因。该表中每个角色名称应该只有一行。
因此,不要每次都使用CreateRole,尝试类似
的内容 bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user)
{
IdentityResult ir;
var rm = new RoleManager<IdentityRole>
(new RoleStore<IdentityRole>(context));
if(!rm.RoleExists("canEdit"))
{
var createResult = rm.Create(new IdentityRole("canEdit"));
if(!createResult.Succeeded)
{
return false;
}
}
return um.AddToRole(user.Id, "canEdit").Succeeded;
}
甚至更好:
bool AddUserAndRole(ApplicationDbContext context, ApplicationUserManager um, Users user, string roleName)
{
return AddUserToRole(context, um, user, "cadEdit");
}
bool AddUserToRole(ApplicationDbContext context, ApplicationUserManager um, Users user, string roleName)
{
IdentityResult ir;
var rm = new RoleManager<IdentityRole>
(new RoleStore<IdentityRole>(context));
if(!rm.RoleExists(roleName))
{
var createResult = rm.Create(new IdentityRole(roleName));
if(!createResult.Succeeded)
{
return false;
}
}
return um.AddToRole(user.Id, roleName).Succeeded;
}