【问题标题】:Enforce security check in ASP.NET MVC?在 ASP.NET MVC 中强制执行安全检查?
【发布时间】:2011-03-05 01:21:35
【问题描述】:

我正在实施一个协作网络画廊,我为每个用户分配了几个角色:

  1. 管理员
  2. 删除图片
  3. 删除OwnImage
  4. 等等..

对于任何控制器动作,我们可以将 [Authorize] 标签应用到它们以及我们想要允许的角色,对吗? Admin/DeleteImage 很好,因为这两个是全局的;但我的问题是,像 DeleteOwnImage 是一种上下文,为了确定它是否有效,我们需要:

  1. 了解它试图删除的图像(来自请求)
  2. 检索该图像的所有者(从服务或存储库)
  3. 比较当前用户 = 所有者

显然 [Authorize] 是不够的,但是否可以在自定义 ActionFilters 上做到这一点?有什么提示吗?

【问题讨论】:

    标签: asp.net-mvc security action-filter actionfilterattribute


    【解决方案1】:

    是的,这可以通过自定义操作过滤器实现。您可以从AuthorizeAttribute 扩展,最基本的实现类似于:

    public class OwnImageAuthorizeAttribute : AuthorizeAttribute {
        public string ImageIdKey { get; set; }
    
        protected override bool AuthorizeCore(HttpContextBase httpContext) {
        bool authorized = false;
        // Get the current user
        var currentUser = ...;
        // Get the image ID, whether it is in the route or querystring
        int imageId
        if(int.TryParse(httpContext.RouteData.Values(ImageIdKey), out imageId)) {
            // From querystring: httpContext.Request.Querystring[ImageIdKey]
            // Authorize the user
            authorized = YourMethodToCheckIfUserIsOwner(currentUser, imageId);
        }
    
        return authorized;
    }
    

    然后,装饰你的方法:

    [OwnImageAuthorize(ImageIdKey = "imageId")]
    public ActionResult MyAction() { }
    

    您可以找到更多详细信息here

    【讨论】:

    • 如果您开始为每个需要您的数据库事务执行此操作,您不认为这种授权方法可能会失控(阅读:许多处理非常具体问题的小类)更新数据库中的内容?
    • 我担心的一件事是属性本身非常依赖于输入的路由数据。 “imageId”在此操作中被命名为 imageId,但在其他路由中它可能变为“Id”。但我认为没有办法摆脱这个,对吧?
    【解决方案2】:

    您可以轻松地在 ActionFilter 中添加类似的内容,只需添加一个实现 OnActionExecuting 的操作过滤器。

    不过,根据您的数据库架构,这可以通过您的查询在数据库级别上实现。当所有者等于收到的收到的 id 时,您可以删除。 (我的意思是,在动作方法中而不是在过滤器中)

    编辑: 如果您为存储库使用某种 IOC 容器,您应该寻找 MVC3 中的新 IOC 功能(如果您使用 MVC3)将依赖项注入您的操作过滤器。

    http://bradwilson.typepad.com/blog/2010/07/service-location-pt4-filters.html

    EDIT2:

    顺便说一句,我自己并不喜欢在 ActionFilters 中做太多的业务逻辑,尤其是涉及到对数据库的调用。当它是用于一项操作的非常具体的东西时更是如此。

    【讨论】:

    • Ninject-mvc3 也可以进行注入。我认为您是对的,这已经进入了业务逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2010-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多