【问题标题】:ASP.NET Custom Role Provider - Additional FieldsASP.NET 自定义角色提供程序 - 附加字段
【发布时间】:2011-04-05 18:33:58
【问题描述】:

在将代码迁移到 ASP.NET 时,我遇到了安全模型问题。

在应用程序中:

  1. 有多个角色。 (角色 A、角色 B 等)

  2. 有多个输入/输出字段。 (字段 A、字段 B 等)

  3. 有多个权限级别控制对每个字段的访问。 (读取、直接编辑、经批准编辑、无)

  4. 每个角色都有自己的字段权限。 (角色 A 对字段 A 具有读取权限;角色 B 对字段 A 具有直接编辑权限等)

  5. 每个角色都可以分配给用户,并且由地理信息分配。 (用户 A 被分配到大陆的角色 A:欧洲 - 国家:德国;用户 B 被分配到大陆的角色 A:欧洲 - 国家:法国;用户 A 被分配到大陆的角色 B:欧洲 - 国家:法国等)

  6. 用户可以有多个角色

  7. 用户身份来自 Windows 身份验证。

所以我的问题/问题是:是否可以使用 ASP.NET 内部成员/角色提供程序来表示这种类型的多层安全模型?

如果是这样,我的出发点应该是什么?仅使用自定义方法和字段创建自定义角色提供程序就足够了吗?

【问题讨论】:

    标签: asp.net security asp.net-membership authorization membership-provider


    【解决方案1】:

    即使使用 ASP.NET、Membership Provider 和用户控件的内置功能,您仍然需要编写和管理自定义行为和交互。

    例如,Membership Provider 为您提供了创建角色和检查角色是否存在的简单方法。但是您必须创建业务特定的仪表板,调用 API 的适合为您的应用程序公开的功能。例如,在我工作过的许多组织中,角色创建只是一个数据库活动。基于角色的用户控件或站点行为是仅代码活动。管理分配给用户的角色是通过应用程序中的管理页面公开的功能。如果确定了对新角色的需求,则必须首先由 DBA 创建它,然后必须编写响应该角色的代码/控件。部署这些项目后,应用程序管理员可以为用户分配或删除角色。

    为了解决您对问题的评论,如果您有Europe_Germany_RoleA,则成员资格 API 为您提供创建该角色、将其映射到用户以及检查其在特定用户上是否存在的方法。喜欢...

    if(User.Roles.Contains("Europe_Germany_RoleA")) {
    //your code here
    }
    

    但您需要将该特定角色映射到特定于您的应用程序的信息或功能。

    回想起来,也许您真正想要查看的是 Profile Provider。仍然是 Membership 集(Membership、Roles、Profiles)的一部分,它更多地用于携带信息。您可以自定义 Profile 对象以满足您的应用程序的需要。例如,如果您将其视为可以在用户登录时加载的扇区(因为没有更好的术语),您可以执行以下查询...

    if(Profile.Sectors.FirstOrDefault(sd=> sd.Name == "Europe_Germany_RoleA") !=  null) {
    //bind to a grid, show a control, do something significant
    }
    

    这可能更适合您的问题。角色实际上只是充当标志(他是否具有此角色,然后做某事或不做某事),但 Profile 对象旨在为用户定制携带相关数据。

    【讨论】:

    • 感谢乔纳森的回答。但我没有也不会担任地理特定的角色,例如 Europe_Germany_RoleA。为用户分配地理区域,以便用户、角色、大陆和国家共同构成用户对记录的访问权限。
    • 抱歉,我的回复是基于您对神秘人问题的评论。话虽如此,我认为 Membership API 仍然可以帮助您以特定于您的应用程序且易于更新和维护的方式管理其中一些通用概念(角色、访问权限等)。
    【解决方案2】:

    您可以随时扩展它。 ASP.NET 成员模型使用 GUID 作为用户和角色的 ID。您可以添加表示所添加功能的新表,并让它们引用原始的 Membership 表。

    【讨论】:

      【解决方案3】:

      您的问题不在于角色提供者或会员系统。该系统足够灵活,可以满足您的需求,并允许您将多个角色分配给各个用户。您可以使用 SQL 表来存储这些角色,也可以使用 Active Directory,AD 可能更易于管理用户。

      您的主要问题是如何为字段和其他对象分配权限。这意味着您不能只使用标准的拖放 Web 表单,而是必须动态构建您的字段。

      检查用户是否在角色中很容易,这是一个单线调用。但是,您的角色可能不会被硬编码,因此您需要一种方法来存储字段和与其关联的角色,以及一种基于用户权限构建字段的方法。

      编辑:

      另一种选择是构建表单,就好像没有安全性一样,然后在您的预渲染事件中通过并将您的安全性应用于每个字段,禁用和/或隐藏您不希望用户看到的字段。如果您选择隐藏这些字段,这可能需要转发这些字段。

      【讨论】:

      • 但主要问题是,例如我没有这个角色:Europe_Germany_RoleA。分配用户时,地理信息应以某种方式映射到用户/角色。
      • 在创建帐户时将用户分配给德国角色。
      • @Lexicon - 我已多次阅读您的帖子,但您在其中没有说过您没有地理角色。事实上,你暗示你这样做。如果您没有它们,并且不想使用它们,那么您应该改写您的问题。
      • 第五项中的示例以及您之前的评论说明了这一点。
      猜你喜欢
      • 2011-06-04
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-06-15
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多