ASP.NET自定义角色提供程序 - 其他字段

时间:2011-04-05 18:33:58

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

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

在申请中:

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

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

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

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

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

  6. 用户可以拥有多个角色

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

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

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的问题不在角色提供程序或成员资格系统中。该系统足够灵活,可满足您的需求,并允许您为单个用户分配多个角色。您可以使用SQL表来存储这些角色,也可以使用Active Directory,AD可能更容易管理用户。

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

检查用户是否在某个角色是很容易的,这是一个单行呼叫。但是,您的角色可能不会被硬编码,因此您需要一种方法来存储字段和与之关联的角色,以及根据用户权限构建字段的方法。

编辑:

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

答案 2 :(得分:1)

即使使用ASP.NET,成员资格提供程序和用户控件的内置功能,您仍然需要编写和管理自定义行为和交互。

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

要解决您的问题,如果您有Europe_Germany_RoleA,则Membership API会为您提供创建该角色,将其映射到用户以及检查其是否存在于特定用户的方法。像...

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

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

回想起来,也许您真正想要看的是Profile Provider。仍然是会员资格集(会员资格,角色,个人资料)的一部分,它更适合携带信息。您可以自定义Profile对象以满足应用程序的需要。例如,如果您将此视为可以在用户登录时加载的扇区(缺少更好的术语),则可以执行类似...的查询。

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

这可能更适合您的问题。角色真正只是作为标志(他是否有这个角色,然后做某事或不做),但是Profile对象被设计为自定义为用户携带相关数据。