基本上这是相关帖子之一:
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));
}
}
答案 0 :(得分:1)
查看将Web API的[Queryable(AllowedQueryOptions=...)]
属性应用于该方法或执行一些等效的限制性操作。如果你这么做,你可以继承QueryableAttribute
以满足你的需要。 See the Web API documentation涵盖了这些情景。
关闭一个或所有控制器查询方法的可用选项非常简单。
还要记住,您可以从action方法中访问请求查询字符串。您可以快速检查“$ expand”和“$ select”并抛出您自己的异常。阻止已知导航路径的扩展并不困难得多(您可以创建白色和黑色列表)。最后,作为最后一道防线,您可以使用Web API操作过滤器或通过自定义JSON格式化器来过滤类型,属性和值。
我们将很快讨论在数据隐藏/过滤中使用授权的更大问题。缺点是:“你真正担心的地方,使用DTO”。