如何在基于属性的MVC授权中使用特定于请求的信息?

时间:2016-07-24 19:56:22

标签: asp.net-mvc

我正在开发一个使用ApplicationFilter保护某些控制器操作的应用,例如:

[MustLogInOrPay]
public virtual ActionResult DownloadImage( int imageId ) {
...
}

因此,MustLogInOrPay扩展了ActionFilterAttribute,并在必要时将它们重定向到用户登录或支付的页面,然后继续到他们去的地方。似乎工作正常。

我想让授权变得更聪明,并允许付费的用户在会话期间无限次地下载相同的图像,以减少他们在初始下载失败时遭受挫折的可能性。

不幸的是,做出决定的代码在MustLogInOrPay中,并且没有imageId可用。因此,我所知道的唯一两种前进方式是:1)将MustLogInOrPay的代码挖掘到原始请求中以找到imageId,听起来很难吃,或者2)使用当前在MustLoginOrPay内部的代码开始DownloadImage,基本上抛出垃圾中基于属性的机制。有没有更好的办法?在全局授权过滤器中使用特定于请求的信息的最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

如果要覆盖AuthorizeCore方法,则应该可以访问授权过滤器内的imageId,如下所示:

public class MustLogInOrPay : AuthorizeAttribute  
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        string imageId= httpContext.Request.RequestContext.RouteData.Values["imageId"].ToString();
    }
}