【问题标题】:ASP.NET MVC AuthorizeAttribute passing values to ActionMethod?ASP.NET MVC AuthorizeAttribute 将值传递给 ActionMethod?
【发布时间】:2010-05-14 01:49:27
【问题描述】:

我只是 ASP.NET MVC 的新手,不知道如何以“正确的方式”完成某项任务。

本质上,我将登录的 userId 存储在 HttpContext.User.Identity 中,并编写了 EnhancedAuthorizeAttribute 来执行一些自定义授权。

在重写的OnAuthorization 方法中,我的域模型命中数据库以确保当前用户ID 可以访问传入的routeValue“BatchCode”。原型是:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode);

如果用户无法访问 ReviewGroup 并且 OnAuthorization 拒绝访问,它将返回 null。

现在,我知道装饰操作方法只有在 OnAuthorization 通过时才会执行,但我不想再次访问数据库以再次获取 ReviewGroup。

我正在考虑将 ReviewGroup 存储在 HttpContext.Items["reviewGroup"] 中,并目前从控制器访问它。

这是一个可行的解决方案,还是我走错了路?

谢谢!

【问题讨论】:

    标签: c# asp.net asp.net-mvc authorize-attribute actionmethod


    【解决方案1】:

    HttpContext.Items 仅在请求期间有效。如果你想持久化它,你应该把它放在

    a) 会话 - 好

    b) 简介 - 看不到优势

    c) cookie - 不推荐

    d) 每次都访问数据库 - 应该没问题

    将其存储在 filterContext.RouteData.DataTokens 中?

    【讨论】:

    • 不,我不需要 ReviewGroup 对象来处理多个请求。真的,我需要的只是将这个对象(在 AuthorizeAttribute.OnAuthorization() 中获得)传递给 ActionMethod()。
    【解决方案2】:

    另外,避免访问数据库的最佳方法之一也是最简单的方法是缓存。 取回它,将其保存在缓存中。如果再次需要它,它已经在内存中,不需要数据库命中。如果没有,那么当缓存超出范围时,对象也会超出范围。

    【讨论】:

      【解决方案3】:

      除非您从ReviewGroup 中进行非常大的选择,或者您拥有庞大的数据库,否则第二次数据库命中不会有太大问题。现代数据库在进行选择方面非常有效,尤其是对于正确索引的表。

      根据我的经验,这是进行授权的最佳方式,并且与我在应用程序中授权特定操作的方式类似。

      所以简而言之,我完全不用担心第二次数据库命中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        相关资源
        最近更新 更多