AuthorizeAttribute MVC - 限制对用户创建内容的访问

时间:2011-10-13 11:02:22

标签: asp.net-mvc authorize-attribute

所以我读到了如何实现自己的授权例程是不好的!

http://www.nashcoding.com/2011/02/05/using-the-forms-authentication-membership-provider-on-appharbor/

我害怕,因为我一直在实施我的行为(例如,如果经过身份验证的用户不是登录用户,则阻止访问帐户详细信息)

public ActionResult DisplayAccount(int someid){
    Account a = context.Accounts.Single(a => a.id == someid);

    // currentUserId() returns userid from FormsAuthentication
    if (!a.owner == currentUserId()){
        /* Not Authorised! */
    }
}

这显然意味着如果ASP决定缓存我的操作会破坏(因此操作甚至不会被执行)。

所以我现在正在考虑使用AuthorizeAttribute来做我需要做的事情,这是

  • 如果未经过身份验证,则阻止访问操作
  • 检查经过身份验证的用户是否有权访问检索到的资源

然而,每当我想到它时,我都无法思考如何实现第二点。角色不起作用,因为它在网站范围内,但在应用程序中,用户也有角色(例如所有者,主持人,贡献者,用户等),并且他们只在应用程序的各自部分中具有这些角色(例如,线程的所有者,维基的贡献者,论坛的主持人等。)

我遇到了几个覆盖AuthorizeCore的例子。我可以想象为我拥有的每个资源创建多个AuthorizeAttribute子类(幸运的是并不多),但仅仅通过查看它,这是否意味着每次我点击该操作时都必须查询数据库以确保登录用户应该是能够访问该数据,然后在我的操作中查询数据库以获取模型,而不是在我的查询中执行此操作?

所以我的问题是

  • 我是否过于担心缓存过多?是否会发生以下任何情况
    • 网站缓存用户A详细信息,该信息在用户B的屏幕上呈现?
    • 网站缓存页面的管理版本(带编辑控件),普通用户看到缓存版本?
  • 使用AuthorizeAttribute是给定的,但是如何在第2点实现我需要做的事情而不必在Action之前点击数据库?或者在任何情况下实现它的最佳方式是什么。
  • 或者我只使用AuthorizeAttribute来确定用户是否已登录,并在我的操作中执行其他检查逻辑?

无论如何,我希望这篇文章不会涉及任何旧路径(我找不到任何关于此事的信息)


编辑:我想,如果我不启用缓存,则不会出现此问题,这是正确的吗?


编辑:现在,我将使用vanilla AuthorizeAttribute,然后在我的操作中检查资源级别访问,然后确保我不对任何经过身份验证的操作使用缓存。希望能在一周内获得更多答案。

1 个答案:

答案 0 :(得分:1)

我在最近的项目中使用了以下方法,创建了一个DataRightsAttribute,它为每个支持的模型类型使用了枚举。它的工作原理是首先从路由数据,formcollection或querystring中提取id。然后它查询由枚举确定的模型类型,并进行适当的检查以查看当前用户是否有权访问它。

用法是这样的:

[DataRights(ModelType.Customer)]

这与AuthorizeAttribute(我们已经覆盖)一起使用,并且从未发现任何缓存问题。