【问题标题】:Implemented claims based roles实现了基于声明的角色
【发布时间】:2016-12-15 12:00:19
【问题描述】:

我最近开始了一个使用 MVC 和实体框架的新项目(对我来说是全新的)。在我的应用程序中,我有两种类型的用户,管理员和非管理员。

我已经在我的数据库中的 configuration.cs 文件中的 seed 方法中植入了一个管理员:

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 旁边。

想知道是否有人能指出我哪里出错了。

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

【问题讨论】:

  • 声明被分配给哪个用户?
  • 我检查了 AspNetUserClaims 表并且全部为空,但我还检查了 AspNetRoles 表,它创建了一个“canEdit”角色并且只提供了一个 ID,我认为它没有链接给用户。

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


【解决方案1】:

您正在通过事物的外观混合您的安全概念。

这里有很多东西在起作用,典型的“简化”解释是......

用户 = 可以登录的人
登录 = 用户的一组凭据

角色 = 将用户和权限组合在一起
声明 = 声明提供者对用户的评价

从问题看来,当您实际上似乎只有 2 个简单角色(用户和管理员)时,您似乎在混合基于声明的身份验证和基于角色的身份验证

基本上选择基于声明的身份验证或基于角色的身份验证并使用其中一个,除非您确实需要复杂性,在这种情况下,您至少需要 3 个月的时间阅读并了解所有这些内容。

总之我会...

创建用户,将用户添加到角色,然后使用基于角色的身份验证,直到您需要超越。

var adminUser = new Users
{
    UserName = "admin@email.com",
    Roles = new [] { "Admins", "Users" } 
};

userManager.Create(adminUser);

【讨论】:

    【解决方案2】:

    然而,@War 关于角色和主张的说法非常正确:

    表 AspNetRoles 包含两列:

    • Id:角色而非用户

    • 的id
    • 名称:角色的名称

    相反,您应该查看表 AspNetUserRoles,它将用户 ID 与角色 ID(列 UserID 和 RoleId)联系起来

    但你还有另一个问题:

    每次尝试将用户分配给“canEdit”时,您都在创建一个新角色。这就是为什么您每次都在 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2015-04-09
      • 2014-05-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2013-08-19
      • 2017-10-03
      • 2015-11-07
      • 1970-01-01
      相关资源
      最近更新 更多