2

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

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 来做我需要做的事情,即

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

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

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

所以我的问题是

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

无论如何,我希望这篇文章没有走上任何老路(我找不到任何我认为明确的东西)


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


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

4

1 回答 1

1

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

用法是这样的:

[DataRights(ModelType.Customer)]

这与 AuthorizeAttribute (我们覆盖)一起使用,并且从未注意到缓存有任何问题。

于 2011-10-13T11:48:35.290 回答