有关细粒度授权和MVC2的问题

时间:2010-07-29 13:26:42

标签: asp.net-mvc-2 authorization

背景:MVC2全新。有C#经验,但网络经验有限。

我需要更精细的访问权限而不是简单地为用户分配角色。用户可以在树中的0+点处拥有角色。

/
  /Europe
    /England
    /France
  /USA

例如,用户可能是“欧洲”下所有论坛的主持人,并且可以在法国发布新闻。

这两个示例控制器具有以下操作:

ForumController:

public ActionResult DeletePost(int id) { ... }

NewsController:

[HttpPost]
public ActionResult Post(int treeID, ...) { ... }

我该如何处理?从我收集的会员+ RoleProvider无法做到这种级别的细粒度控制。 以前我编写了支持所有这些的自定义用户/角色/身份验证系统,但它与“标准”控件(如LoginView)不兼容。

目标是让角色允许访问,如下所示:

NewsAdmin

  • 添加新闻

  • 编辑新闻

  • 删除新闻

NewsPoster

  • 添加新闻

因此,新闻控制器的Post动作应该检查:用户是否有“添加新闻” - 他试图发布的地址?

我真的想以某种方式使用属性来指定它,所以实际的动作代码可能更干净,只是假设调用者具有适当的访问权。

希望这个问题有道理,我可以在哪里阅读。

(哦,我确定这个问题之前已经在某些变体中得到了解答。我似乎无法找到它。如果您觉得它们可能对阅读有帮助,我不介意单链接回复)

1 个答案:

答案 0 :(得分:0)

我认为你过于迅速地解雇角色提供者。如果用户有一个名为NewsAdmin_Europe_AddNews的角色几乎可以回答这个问题,那不是吗?

一旦您的身份验证方案与角色提供程序一起使用,您需要将其与MVC联系起来。子类型AuthorizeAttribute并覆盖AuthorizeCore警告:此处的代码必须是线程安全且可重入的。调用base.AuthorizeCore,然后根据URI /查询测试特定角色(从那时起您将无法获取路由值这可以从缓存中提供,完全绕过MVC)。

这是一些工作,但最终会比尝试重新发明成员资格更安全。