Asp.net mvc 2 如何对特许经营企业进行基于角色的访问控制?

Asp.net mvc 2 如何对特许经营企业进行基于角色的访问控制?,asp.net-mvc-2,authorization,repository-pattern,access-control,Asp.net Mvc 2,Authorization,Repository Pattern,Access Control,我正在ASP.NET MVC 2中为特许经营服务业务构建基于web的CRM+CMS的第二次迭代。我需要根据为该特许经营分配的用户角色控制对每个特许经营服务的访问 4个示例: 接待员应该能够为她的“大西洋海岸”特许经营权预订服务工作,但不做任何报告 技师应该能够更改维修作业,但不能修改发票 经理应该能够对其门店内工作的发票进行折扣 所有者应该能够获取他拥有的任何特许经营权的报告 特许经营级别的访问控制在数据-服务-Web层之间应该放在哪里? 如果它属于我的控制器,我应该如何最好地实现它 部分模

我正在ASP.NET MVC 2中为特许经营服务业务构建基于web的CRM+CMS的第二次迭代。我需要根据为该特许经营分配的用户角色控制对每个特许经营服务的访问

4个示例:

  • 接待员
    应该能够为她的“大西洋海岸”特许经营权预订服务工作,但不做任何报告
  • 技师
    应该能够更改维修作业,但不能修改发票
  • 经理
    应该能够对其门店内工作的发票进行折扣
  • 所有者
    应该能够获取他拥有的任何特许经营权的报告
特许经营级别的访问控制在
数据-服务-Web
层之间应该放在哪里?
如果它属于我的控制器,我应该如何最好地实现它

部分模式
角色
类 部分
特许经营
UserRoles
映射 控制器实现 具有
[Authorize]
属性的访问控制 如果只涉及一个特许经营权,我可以简单地限制对控制器操作的访问,如下所示:

[Authorize(Roles="Receptionist, Technician, Manager, Owner")]
public ActionResult CreateJob(Job job)
{
    ...
}
而且,由于特许经营权不会在夜间突然出现,因此使用ASP.NET MVC 2中新的区域功能可能是一个很好的例子?或者这会导致重复视图吗

控制器、URL路由和区域 假设未使用区域,那么确定访问哪个特许经营数据的最佳方式是什么?我想到了这一点:

{franchise}/{controller}/{action}/{id}
或者在详细信息(…)操作中确定作业的特许权并使用[授权]限制用户的操作更好:

{job}/{id}/{action}/{subaction}
{invoice}/{id}/{action}/{subaction}
如果任何用户都有可能访问多个特许权,而不必使用{franches}参数混乱URL,那么这就更有意义了

欢迎您的任何意见

编辑:

背景 我用经典ASP构建了以前的CRM,它运行得很好,但现在是升级的时候了,可以加快工作流程,减少出错的空间。为了正确的测试和更好地分离数据和表示,我决定实现Rob Conry的MVC店面系列中的存储库模式

如何安排服务和存储库?
有一个基于可用过滤器检索任何服务作业的
JobService
是有意义的,例如
IQueryable-GetJobs()。但是,由于一个作业只能属于一个特许经营权,类似于
IQueryable GetJobs(int特许经营ID)的函数可以属于
特许服务
作业服务
特许服务
是否应该充当
目录服务
(如MVC店面)?

让我试着回答这个问题。我正在玩一个示例应用程序,它涉及到了上面提到的一些方面。这不是一个权威的答案,只是经验

特许经营级别的访问控制在数据-服务-Web层之间应该放在哪里?

这种访问限制应该 渗透到您的应用程序中 两个级别1)数据库2) 应用层。在MVC上下文中,我 建议创建一个自定义 授权属性-此属性处理 Web服务之间的安全性 层。我会让这个属性做什么 两件事

  • 获取用户允许的当前角色(可以从数据库中获取) 存储在用户会话中)
  • 执行检查以查看用户是否属于允许的角色列表的一部分。 关于数据库,这是 取决于您存储数据的方式 数据,所有特许经营的一个数据库 或每个特许经营数据库。在 首先,有几种方法可以限制 并设置访问限制 将数据传输到特定 特许经营权
  • 既然特许经营权不只是一夜之间突然出现,那么使用ASP.NET MVC 2中的新区域功能也许是一个很好的例子?或者这会导致重复视图吗?

    我认为应该利用这些区域 拆分和分组功能。如果你 使用区域分割特许经营权, 这就是我看到的复制品 视图、控制器等正在发生。复制品 视图可以通过使用 自定义视图引擎,以便 覆盖MVC查找您的 意见。插头:看我的答案

    假设未使用区域,确定访问哪个特许经营数据的最佳方式是什么?

    如上所述,您可以 用户会话以存储基本信息 特许经营权等信息 用户所属和角色等 分配。我想我读过的规则 有些地方是沿着 “保护你的行动,而不是你的 控制器“

    为标准和标准创建路线等 也不例外。有吗 目前,一个商业案例表明 用户可以访问多个 特许经营权

    如何安排服务和存储库?

    拥有一组基本服务或基本服务 将包含所有 特定项目所需的信息 特许经营权,如
    特许经营ID
    。 它所解决的主要问题是 你的服务方式更干净 没有
    特许ID
    参数。 然而,存储库可能需要这样做 价值,因为你需要 消除您正在使用的数据的歧义 请求或存储(假设一个数据库) 适用于所有特许经营权)。然而,你 使用IoC可以克服一些问题

    我看到的缺点是 他们知道,总会有人打电话给他们 每次创建对象时都使用数据库 创建(即如果
    特许经营权
    如果要使用该路线,您需要 转到数据库以获取 每次对应的特许ID 您创建了一个服务对象。(我可能 在这一点上你可能弄错了,因为国际奥委会 骗局
    [Authorize(Roles="Receptionist, Technician, Manager, Owner")]
    public ActionResult CreateJob(Job job)
    {
        ...
    }
    
    {franchise}/{controller}/{action}/{id}
    
    {job}/{id}/{action}/{subaction}
    {invoice}/{id}/{action}/{subaction}