实施基于声明的角色

时间:2016-12-15 12:00:20

标签: c# asp.net model-view-controller

我最近开始使用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旁边。

想知道是否有人可以指出我出错的地方。

提前感谢您的帮助,如果我错过了这篇文章中的任何必要信息,请通知我。 :)

2 个答案:

答案 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;
    }