白标服务访问的角色

时间:2009-03-31 14:05:15

标签: asp.net architecture asp.net-2.0 roles security-roles

好,

我知道我做错了什么 - 却无法找到更好的方法。 我正在开发一个允许用户设置自己的迷你网站的网站。

像宁这样的东西。 此外,我只有1个基本登录,并且通过角色提供了对每个迷你网站的访问权限(现在)。

所以我现在这样做的方式是:

每次创建一个新的迷你网站 - 比如说,我在我的应用程序中创建了两个角色。 blah_users blah_admin

创建迷你网站的用户被赋予角色 - blah_admin,并且希望加入此迷你网站(或网络)的每个其他用户都被赋予角色 - blah_user。

任何人都可以查看任何网站的数据。但是,要添加数据,必须是该迷你站点的成员(必须分配blah_user角色)

我面临的问题是,通过基于角色的系统,我不得不手动完成大量的工作。 Asp.Net 2控件在User.IsAunthenticated属性上工作对我来说基本上没用,因为除了IsAuthenticated属性,我还必须检查用户是否具有正确的角色。

我猜有一种更好的方法来构建系统,但我不确定如何。 有什么想法吗?

该网站正在IIS 6上的ASP.Net 2中开发。 非常感谢!

1 个答案:

答案 0 :(得分:1)

我担心ASP.NET的标准角色相关内容不是你需要的。您可以尝试更改身份验证模块,以便:

  1. 使用cookie登录。
  2. 确定访问者的角色。也许您将使用一些与用户和站点相对应的特殊表。
  3. 使用枚举的用户角色制作自定义主体,并将Identity和Principal分配给当前请求。
  4. 我也不认为为每个网站制作特殊角色是个好主意。当你有100个网站时,你还有200个角色。我很害怕,相当难以管理。

    当我们解决类似的任务时,我们只是没有使用标准控件。我们在所有网站上都使用了一组角色。具体用户的成员资格根据当前网站及其与本网站的关系确定。

    添加:另一种可能的调查是ASP.NET身份验证系统中存在的应用程序。也许可以将每个子网站隔离到单独的应用程序中?

    更新:适合我们应用的方法。

    1. 不要做很多克隆的角色。仅使用两个:用户和管理员。如果您的站点是公共的,那么“用户”角色可能只是全局 - 一个站点上的用户与另一个站点上的用户没有区别。如果“用户”和“所有人”是不同的角色,那么“用户”当然也应该绑定到某个站点。

    2. 使用标准ASP.NET成员资格用户,但不使用标准角色机制。

    3. 建立一种存储网站与用户之间关系的机制。它可以是包含站点ID,用户和角色的简单表。

    4. 您必须覆盖的是IsInRole方法。 (方法 s 确切地说,我将在稍后介绍)。此方法在IPrinciple接口中,因此您必须创建自己的主体对象。这很简单。

      1. 方法此类型的IsInRole应该看当前站点(来自HttpRequest)查看site-user表并获取角色
    5. 然后您必须将您的委托人与请求相关联。在PostAuthenticateRequest事件中执行。

    6. 还有RoleProvider。老实说,我不确定它何时使用,但它也有IsInRole方法。我们可以用同样的方式覆盖它。但是这个提供者的其他方法更难。例如AddUsersToRoles。它接受用户名和角色的数组,但是应该添加哪些上下文(站点)?到现在?不确定,因为我不知道何时调用此方法。所以它需要一些实验。我看到(Reflector帮助)RopePrincipal本身使用RoleProvider来获取角色列表,所以也许它只使用标准主体实现RoleProvider。对于我们的应用程序,这不是一个案例,所以我不能说这里可以隐藏哪些问题。