在使用Breezejs时,可用于限制扩展的使用,这样的用户无法访问敏感数据

时间:2013-04-16 20:33:53

标签: breeze

基本上这是相关帖子之一:

Isn't it dangerous to have query information in javascript using breezejs?

这是我的第一个问题,但接受那里的asnwers,我真的很感激,如果有人有关于如何限制客户可见的范围的示例或教程。

我从Knockout / Breeze模板开始,并根据我正在做的事情进行了更改。坐在一个几乎完成的项目与一个问题。安全。 我已经修复了身份验证并正在进行授权,并试图弄清楚如何确保人们无法获得他们无法查看的内容。

我在根模型上修复了第一层,成员只能看到他创建或公开的内容。但是,用户可以使用extend来获取Object.Member.Identities。这意味着他获得了公共对象的所有身份。

是否有任何教程可以帮助我限制用户可以查询的内容。 我应该用ObjectDto包装返回的对象吗?创建时我可以验证它是否包含敏感信息吗?

很高兴我能够做到这一点,但有些教程会很好用一些指针。

代码

控制器

    public IQueryable<Project> Projects()
    {


        //var q = Request.GetQueryNameValuePairs().FirstOrDefault(k=>k.Key.ToLower()=="$expand").Value;
       // if (!ClaimsAuthorization.CheckAccess("Projects", q))
          //  throw new WebException("HET");// UnauthorizedAccessException("You requested something you do not have permission too");// HttpResponseException(HttpStatusCode.MethodNotAllowed);

        return _repository.Projects;
    }

_repository

    public DbQuery<Project> Projects
    {
        get
        {

            var memberid = User.FindFirst("MemberId");
            if (memberid == null)
                return (DbQuery<Project>)(Context.Projects.Where(p=>p.IsPublic));

            var id =  int.Parse(memberid.Value);
            return ((DbQuery<Project>)Context.Projects.Where(p => p.CreatedByMemberId == id || p.IsPublic));
        }
    }

1 个答案:

答案 0 :(得分:1)

查看将Web API的[Queryable(AllowedQueryOptions=...)]属性应用于该方法或执行一些等效的限制性操作。如果你这么做,你可以继承QueryableAttribute以满足你的需要。 See the Web API documentation涵盖了这些情景。

关闭一个或所有控制器查询方法的可用选项非常简单。

还要记住,您可以从action方法中访问请求查询字符串。您可以快速检查“$ expand”和“$ select”并抛出您自己的异常。阻止已知导航路径的扩展并不困难得多(您可以创建白色和黑色列表)。最后,作为最后一道防线,您可以使用Web API操作过滤器或通过自定义JSON格式化器来过滤类型,属性和值。

我们将很快讨论在数据隐藏/过滤中使用授权的更大问题。缺点是:“你真正担心的地方,使用DTO”。