我正在开发一个使用ApplicationFilter保护某些控制器操作的应用,例如:
[MustLogInOrPay]
public virtual ActionResult DownloadImage( int imageId ) {
...
}
因此,MustLogInOrPay扩展了ActionFilterAttribute,并在必要时将它们重定向到用户登录或支付的页面,然后继续到他们去的地方。似乎工作正常。
我想让授权变得更聪明,并允许付费的用户在会话期间无限次地下载相同的图像,以减少他们在初始下载失败时遭受挫折的可能性。
不幸的是,做出决定的代码在MustLogInOrPay中,并且没有imageId可用。因此,我所知道的唯一两种前进方式是:1)将MustLogInOrPay的代码挖掘到原始请求中以找到imageId,听起来很难吃,或者2)使用当前在MustLoginOrPay内部的代码开始DownloadImage,基本上抛出垃圾中基于属性的机制。有没有更好的办法?在全局授权过滤器中使用特定于请求的信息的最佳做法是什么?
答案 0 :(得分:0)
如果要覆盖AuthorizeCore方法,则应该可以访问授权过滤器内的imageId,如下所示:
public class MustLogInOrPay : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
string imageId= httpContext.Request.RequestContext.RouteData.Values["imageId"].ToString();
}
}