如何在没有硬编码的情况下使用Roles(asp.net)?

ale*_*nso 5 asp.net roles dynamic

创建/删除角色时,我不想修改代码.

if (HttpContext.Current.User.IsInRole("Super Admin") ||
    HttpContext.Current.User.IsInRole("Admin") ||
    HttpContext.Current.User.IsInRole("Support"))
{
    if (HttpContext.Current.User.IsInRole("Admin"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin" });

    }
    if (HttpContext.Current.User.IsInRole("Support"))
    {
        ListBox1.DataSource = Roles.GetAllRoles().Except(
            new[] { "Super Admin", "Admin" });
    }
    fillDropDownCustomers();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*han 2

角色通过为用户可以执行的操作分配值来发挥作用。角色不会改变,但这些角色的行为会改变。超动态解决方案往往是矫枉过正。

那么也许你有以下角色

  • 超级管理员
  • 支持
  • 行政

您可以有不同的操作(这取决于您的系统)

  • 看法
  • 编辑
  • 批准

ETC

  • 超级管理员【查看、编辑、批准】
  • 支持[查看]
  • 管理员[查看、编辑]

动态部分来自于动作的分配。通过这种方式做事,你并不关心某人扮演什么角色,而是关心他们有什么行为。行动是这种关系中的动态方面。发出请求时,您将使用用户角色来获取分配给该角色的操作(数据库驱动以使其可修改)

将其合并到数据库结构中作为“角色有许多操作”,意味着如果将来情况发生变化,您将需要更新数据库中的关系而不是代码。

数据库结构可能看起来像这样,取决于您的需求。

  • UserRole [ID、UserName、RoleID](如果为用户分配了多个角色,他们将继承所有操作,这些操作可能会重复,因此选择 DISTINCT 或防止出现这种情况,但我相信前者提供了更大的灵活性,而没有复杂性和限制。注意: UserRole 表可以进一步非规范化以使 UserNames 唯一。)
  • 角色[ID、姓名]
  • 操作 [ID、名称]
  • RoleAction [ID, RoleID, ActionID](RoleID 和 ActionID 的唯一键约束)

发出请求时,您识别用户等UserName,然后通过查询 RoleAction 来确定他们所处的角色,从而加载其关联的操作

我会使用枚举来表示您的操作和角色值。这使得使用起来更加容易。为了确保数据库和代码位于接收器中,请确保编写单元测试来协调数据库值与枚举值。