Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在不硬编码的情况下使用角色(asp.net)?_Asp.net_Dynamic_Roles - Fatal编程技术网

如何在不硬编码的情况下使用角色(asp.net)?

如何在不硬编码的情况下使用角色(asp.net)?,asp.net,dynamic,roles,Asp.net,Dynamic,Roles,创建/删除角色时,我不想修改代码 if (HttpContext.Current.User.IsInRole("Super Admin") || HttpContext.Current.User.IsInRole("Admin") || HttpContext.Current.User.IsInRole("Support")) { if (HttpContext.Current.User.IsInRole("Admin")) { ListBox1.

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

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();
}

角色通过为用户可以做的事情分配值来工作。角色不会改变,但角色的行为会改变。超动态解决方案往往过于致命

因此,您可能有以下角色

  • 超级管理员
  • 支持
  • 管理员
您可以有不同的操作(这取决于您的系统)

  • 看法
  • 编辑
  • 批准

  • 超级管理员[查看、编辑、批准]
  • 支持[查看]
  • 管理员[查看、编辑]
动态部分来自动作的分配。用这种方式做事,你不在乎别人扮演什么角色,而是在乎他们采取了什么行动。行动是这种关系中的动态方面。当发出请求时,您将使用用户角色获取分配给该角色的操作(数据库驱动以使其可修改)

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

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

  • UserRole[ID,UserName,RoleID](如果为用户分配了多个角色,他们将继承所有操作,这些操作可能会重复,因此选择不同的操作或防止出现这种情况,但我认为前者提供了更大的灵活性,没有复杂性和限制。注意:UserRole表可以进一步非规范化,以使用户名唯一。)
  • 角色[ID,名称]
  • 行动[身份证,姓名]
  • RoleAction[ID,RoleID,ActionID](RoleID和ActionID上的唯一键约束)
当发出请求时,您可以识别用户等用户名,然后通过查询角色反应来确定他们所处的角色,从而加载他们相关的操作


我将使用枚举作为您的操作和角色值。这会使您更容易使用。要确保数据库和代码位于接收器中,请确保您编写一个单元测试,使数据库值与枚举值一致。

将这些值放入静态类:

public static class MyRoles
{
    public const string Admin = "Admin";
    public const string SuperAdmin = "Super Admin";
    public const string Support = "Support";
}
现在您可以像这样重用它们:

if (HttpContext.Current.User.IsInRole(MyRoles.SuperAdmin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Admin) ||
    HttpContext.Current.User.IsInRole(MyRoles.Support))
{

简单的答案是使用常量。更多的上下文答案是使用IoC将逻辑推送到另一个类中,您可以在其中管理配置或数据库中的关系。

正如其他答案所建议的,作为常量变量。但是,如果要更改其中一个的名称,您仍然需要更改代码并重新发布e角色

另一个选项是将角色的名称添加到配置文件中。您可以使用应用程序设置,或者使用从
ConfigurationSection
继承的自定义配置类。在此处查看如何使用


通过这种方式,您可以在web.config文件中更改角色的名称,而不必更新任何代码或重新发布项目。

我认为,如果不使用其他答案所建议的常量,那么仍然需要将角色硬编码到代码中。这是可以的,但角色的使用如que中所示stion还没有被很好地理解,因此希望将角色扩展为动态的东西,而实际上他们的行为是动态的。非常感谢这个答案。这真的很有帮助,因为我在需要执行操作的每个部分启用/禁用用户,而不是询问数据库他们是否能够。但是r、 我仍然想知道,如果某个特定用户能够创建某些记录,但不能创建所有记录,会发生什么:创建一个名为“创建”的操作这不是最有效的解决方案,对吗?我必须在表操作和其他表之间创建关系吗?非常感谢您的帮助!很明显,新表中的角色和操作也将是表的FKs。以防万一我不太清楚。非常感谢您提供此答案!!真的吗为我的客户端的设置阐明了一种可用的方法。他们的网站使用.NET成员身份设置权限,但用户群通过非托管的第三方web服务进行身份验证,没有角色概念,只是在一个变化很大的层系统上对几个用户属性进行一些计算!这将意味着执行许多复杂的操作d逻辑在运行时,但这是我已经接近找到一个工作了。谢谢,谢谢,谢谢!