【问题标题】:Passing objects between AuthorizeAttribute and Controller在 AuthorizeAttribute 和 Controller 之间传递对象
【发布时间】:2014-03-14 15:12:33
【问题描述】:

要通过 Id 授权对项目的 GET 请求,我在自定义 AuthorizeAttribute 中查询项目以验证经过身份验证的用户具有访问权限。为了防止在ApiController 操作中重复查询,我想将对象从AuthorizeAttribute 传递给操作。

由于在ActionArgument 绑定程序运行之前在管道中调用了AuthorizeAttribute,因此我无法通过HttpActionContext.ActionArguments 传递对象。我也担心将其序列化为查询字符串并可能会超出长度限制。

传递项目的一个选项是将其存储在HttpContext.Current.Items 中,并在操作中检索时将其施放。我已经读到即使在异步操作中这也可以工作,但似乎有相当多的建议不要使用 Items 字典。

我应该简单地重新查询操作中的项目吗?使用Items 字典合适吗?是否适合为此目的使用ActionFilterAttribute 以允许访问HttpActionContext.ActionArguments,即使我正在使用它进行授权?还有其他我忽略的向量吗?

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api authorization


    【解决方案1】:

    【讨论】:

    • 有什么理由比HttpContext.Items 更合适?根据 MSDN 定义,Items 似乎更合适,因为它特别提到了接口之间的数据共享。我开始倾向于Items,因为大多数反对它的建议都提到避免与特定(Web)实现耦合,但AuthorizeAttribute 似乎已经与Web.Http/Web.Mvc 耦合。不确定有效性,但我也发现了这个:stackoverflow.com/questions/12646828/…
    • 几个原因 - 易于单元测试和主机无关。通过使用HttpContext,您将自己锁定为网络托管 (IIS/ASP.NET)。 HttpContext.Current 将会为空,例如,如果您要使用 OWIN 托管它。
    【解决方案2】:

    我用这个代码

     protected override bool AuthorizeCore(System.Web.Http.Controllers.HttpActionContext actionContext)
                {
                    BaseApiController baseApi = actionContext.ControllerContext.Controller as BaseApiController;
                    baseApi.Property = 10;
                }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多