0

好的,

我知道我做错了什么——但想不出更好的方法。我正在开发一个允许用户设置自己的迷你网站的网站。

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

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

每次创建一个新的迷你网站 - 比如说等等,我都会在我的应用程序中创建 2 个角色。 blah_usersblah_admin

创建迷你网站的用户被赋予角色 - blah_admin 并且每个想要加入这个迷你网站(或网络)的其他用户被赋予角色 - blah_user。

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

我面临的问题是,通过做一个基于角色的系统,我不得不手动做很多事情。在 User.IsAunthenticated 属性上工作的 Asp.Net 2 控件现在对我来说基本上没用,因为除了 IsAuthenticated 属性之外,我还必须检查用户是否具有适当的角色。

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

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

4

1 回答 1

1

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

  1. 使用 cookie 登录。
  2. 确定访问者的角色。也许你会使用一些特殊的表来对应用户和站点。
  3. 使用枚举的用户角色制作自定义主体,并将身份和主体分配给当前请求。

我也不认为为每个站点制作特殊角色是个好主意。当你有一百个站点时,你也会有两百个角色。恐怕很难管理。

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

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

更新:适用于我们应用程序的方法。

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

  2. 使用标准 ASP.NET Membership 用户,但不使用标准角色机制。

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

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

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

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

于 2009-03-31T14:25:38.403 回答