2011-10-13 61 views
2

因此,我读了关于如何实现自己的授权例程不好!AuthorizeAttribute MVC - 限制访问用户创建的内容

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子类(幸运的是不是很多),但仅仅通过查看它,是否意味着每次我执行该操作时都必须查询数据库,以确保登录的用户应该能够访问这些数据,然后在我的动作中查询数据库以获取模型,而不是在我的查询中这样做?

所以我的问题是

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

无论如何,我希望这个帖子是不是踩在任何旧的路径(我无法找到这个东西,我发现明确的)


编辑:我想,如果我不” t启用缓存这个问题不会发生,这是正确的吗?


编辑:现在,我将要使用香草AuthorizeAttribute,然后检查资源级别的访问在我的动作,然后确保我不使用缓存的任何身份验证操作。希望这周能得到更多答案。

回答

1

我在最近的一个项目中使用了下面的方法,创建一个DataRightsAttribute,为每个支持的模型类型使用一个枚举。它首先从路由数据,表单收集或查询字符串中提取id。然后它查询由枚举确定的模型类型,并进行相应的检查以查看当前用户是否有权访问它。

用法是这样的:

[DataRights(ModelType.Customer)] 

这是用来一起AuthorizeAttribute(我们overrided),并且从来没有注意到与高速缓存的任何问题。

+0

这是否需要严格约定(总是以id作为参数)?你在检查过程中查询数据库,是吗? –

+0

不一定,在该实现中,我可以更改源名称。但是id是默认值。是的,数据库在这里被查询。为了减少查询次数,我还通过一个包装器将对象存储在HttpRequest.Current.Items中,因此一个操作方法可以很容易地从那里访问它,而不需要重新查询。 – Trax72

+0

我希望这个问题不仅仅只有一个答案==“谢谢你的回答。 –