ASP.net角色和项目

Zyp*_*rax 5 asp.net forms-authentication asp.net-membership roles

编辑 - 重写我原来的问题,以提供更多信息


背景信息
在我的工作中,我正在为客户开发ASP.Net Web应用程序.在我们的实现中,我们使用诸如Forms身份验证与MembershipProviders和RoleProviders之类的技术.一切顺利,直到我遇到配置角色的一些困难,因为角色不是系统范围的,而是与客户帐户和项目相关.

我无法确定我们的确切设置/配方,因为我认为我们公司不会批准......

什么是客户/项目?
我们公司每年(或其他间隔)为客户提供管理信息.
在我们的系统中,客户/合同包括:

  • 一个帐户:有关公司的信息
  • 每个帐户,一个或多个产品:我们将提供的管理信息包
  • 每个产品,一个或多个测量:一段时间,我们收集并报告数据

外联网站点设置
最终,我们希望所有客户都能够通过我们的在线系统访问其管理信息.外联网由两个站点组成:

  • 公司站点:提供帐户信息和产品的概述
  • 测量地点:选择测量后,详细了解该段时间

测量站点是外联网中最有趣的部分.我们将为新的概述,报告,管理和维护对研究重要的资源创建子模块.

我们的Visual Studio解决方案包含许多项目.一个名为Portal的Web应用程序作为基础.站点和模块是该应用程序中的虚拟目录(使得在事物之间共享MasterPages更容易).

什么样的角色?
以下用户(读取:角色)将使用该系统:

  • 管理员:开发用户:)(不是客户相关,完全访问)
  • 员工:我们公司的员工(不是客户相关的,完全访问权限)
  • 客户超级用户:顶级经理(完全访问其帐户/度量)
  • 客户联系人:主要联系人(完全访问他们的测量)
  • 客户经理:部门经理(访问受限,测量的具体数据)

ASP.Net用户怎么样?
该系统将拥有许多ASP.Net用户,让我们关注客户用户:

  • 帐户之间不共享用户
  • SuperUser X可自动访问所有(和新的)测量值
  • 用户Y可以是测量1的主要联系人,但对于测量2没有任何作用
  • 用户Y可以是测量1的主要联系人,但具有测量2的管理员角色
  • 部门经理是很多个人用户(按照度量),如果经理Z登录了Measurement 1,我们希望再次使用该登录,如果他参与Measurement 2.

URL结构
这些是我们应用程序中的典型URL:

我们还将创建一个文档URL,您可以通过它的GUID请求特定文档.系统必须检查用户是否拥有该文档的权限.该文档与度量相关,用户或特定角色对文档具有特定权限.

有什么问题?(最后;))
角色不足以确定允许用户查看/访问/下载特定项目的内容.仅仅说管理者可以访问某个导航项是不够的.当用户请求Measurement 1000时,我们必须检查用户不仅具有Manager角色,还具有Measurement 1000的Manager角色.

总结如下:

  1. 我们如何限制用户的帐户/度量?
    (记得超级用户看到所有测量值,有些经理只能进行具体测量)

  2. 我们如何在产品/测量级别应用角色?(用户X可以是测量1的主要接触,但只是测量2的管理者)

  3. 我们如何限制经理访问报告屏幕并仅限制其部门的报告?

所有这些都具有asp.net类的神奇功能,可能还有自定义的roleprovider实现.

类似Stackoverflow问题/问题
ASP.NET,如何管理具有不同类型角色的用户

Tho*_*mas 3

您从我看到的各种帖子中寻求的是自定义角色机制,或者换句话说,自定义授权机制。身份验证仍然可以使用标准的 SqlMembershipProvider。

我不确定标准角色提供者是否会为您提供您想要的内容,因为授权要求您拥有项目的上下文。但是,您可能会研究编写自定义 RoleProvider 以查看是否可以创建一些自定义方法来执行此操作。尽管如此,为了回答这个问题,我将假设您不能使用 SqlRoleProvider。

所以,这里有一些潜在的模式:

Create Table Companies
(
    Id int not null Primary Key
    , ...
)
Create Table Projects
(
    Id int not null Primary Key
    , PrimaryContactUserId uniqueidentifier
    , ...
    , Constraint FK_Projects_aspnet_Users
        Foreign Key ( PrimaryContactUserId )
        References dbo.aspnet_Users ( UserId )
)
Create Table Roles
(
    Name nvarchar(100) not null Primary Key
    , ...
)

Create Table ProjectCompanyRoles
(
    CompanyId int not null
    , ProjectId int not null
    , RoleName nvarchar(100) not null
    , Constraint FK_...
)
Run Code Online (Sandbox Code Playgroud)

正如我之前所说,将 PrimaryContact 包含在 Projects 表中的原因是为了确保给定项目只有一个。如果将其作为角色包含,则必须包含一堆跳圈代码,以确保一个项目不会分配多个 PrimaryContact。如果是这种情况,则从 Projects 表中取出 PrimaryContactUserId 并将其设为角色。

授权检查需要针对 ProjectCompanyRoles 进行查询。同样,项目和公司上下文的添加使得使用默认角色提供程序出现问题。如果您想使用 .NET 机制进行角色和身份验证,那么您必须实现自己的自定义 RoleProvider。