.net 4.0 如何锁定.net 4.0 WCF数据服务

.net 4.0 如何锁定.net 4.0 WCF数据服务,.net-4.0,soa,odata,wcf-data-services,.net 4.0,Soa,Odata,Wcf Data Services,我有一个WCF数据服务发布了大约2个月。它已经100%被黑客入侵了。我甚至注意到twitter上发布的服务 幸运的是,我的网站正在开发中,用户实体只有大约80名测试人员 这仍然是一个相当大的问题。借助E.F.导航属性的强大功能,任何人都可以轻松编写一个脚本来下载我的所有用户数据和其他人没有的宝贵域数据。我希望提供未经身份验证的访问,并执行以下操作: 限制暴露哪些列(例如用户电子邮件) 限制每天可能的请求数量(例如,每个请求主机地址10个) 当有人误用服务时收到通知 限制不同实体集上的结果集和展开

我有一个WCF数据服务发布了大约2个月。它已经100%被黑客入侵了。我甚至注意到twitter上发布的服务

幸运的是,我的网站正在开发中,用户实体只有大约80名测试人员

这仍然是一个相当大的问题。借助E.F.导航属性的强大功能,任何人都可以轻松编写一个脚本来下载我的所有用户数据和其他人没有的宝贵域数据。我希望提供未经身份验证的访问,并执行以下操作:

  • 限制暴露哪些列(例如用户电子邮件)
  • 限制每天可能的请求数量(例如,每个请求主机地址10个)
  • 当有人误用服务时收到通知
  • 限制不同实体集上的结果集和展开选项
  • 我还没想过的事情
  • 这有意义吗?或者我应该放弃WCF数据服务吗?理论上,WCF数据服务听起来很棒,但现在我有了使用它们的经验,我想知道它们是否只适合开发而不是生产(它们比我预期的要胖)

    在此,我将非常感谢超出我知识范围的想法和建议


    同时发布任何链接,以彻底的博客文章的例子或视频介绍,涵盖地面将是极好的

    我认为您需要实现一些身份验证。我想不出其他方法来“锁定”web服务。这是WCF的优点之一——它使实现复杂的身份验证变得容易。

    在我的WCF服务上,我需要一个UserContext对象,它只包含两个字符串,用户名和密码

    服务上的每个方法都需要该上下文,如果我没有将用户名/密码添加到数据库中,它会拒绝该请求

    这也使得追踪滥用服务的人变得简单,因为你会将他们的用户名/密码绑定到每个请求上


    您还应该通过SSL运行它,这样其他用户的凭据就不会轻易被泄露。

    1-WCF数据服务目前不允许您根据每个请求轻松筛选列。您可以有两个EF模型(一个“公共”,一个“私有”),并将它们作为两个服务公开。任何人都可以访问的公共文件,完全授权后的私人文件

    2-这一点您必须自己实施。但要想让它起作用,你需要一些方法来识别用户。所以它非常接近身份验证(即使它不需要密码或类似的东西)。这里有一系列关于通过WCF数据服务进行身份验证的帖子:

    3-如果您可以根据#2识别用户,例如,您可以计算他/她发出的数量或频率或请求,并基于此设置通知。同样,用于auth的技术应该为您提供正确的挂钩

    这相当简单。WCF数据服务允许您设置响应大小的硬限制(DataServiceConfiguration.MaxResultsPerCollection)或软限制,这意味着分页。分页通常更好,因为它限制了单个响应的大小,但仍然允许客户端通过多个请求获取所有数据。这可以通过DataServiceConfiguration.SetEntitySetPageSize完成。exand行为可能受到DataServiceConfiguration.MaxExpandCount和MaxExpandDepth属性使用的限制

    其他一些可能使用的技术

    • 查询拦截器(http://msdn.microsoft.com/en-us/library/dd744842.aspx)-这允许您根据每个请求筛选行。通常用于根据发出请求的用户限制行(请注意,这只允许筛选行,而不允许筛选列)

    • 服务操作-如果您定义了一个返回IQueryable的服务操作,那么客户端仍然可以在其上组合查询,但它使您能够在应用查询之前过滤数据。或者,您可以仅通过服务操作访问某些信息(不易使用,也不可查询,但它可以让您完全控制)。(http://msdn.microsoft.com/en-us/library/cc668788.aspx)


    我的问题是我想要未经验证的访问。也许我需要某种应用程序密钥,但我的愿望并不真实。一个应用程序密钥可以在3秒钟内阻止它们。没有某种个性化的密钥或用户名/密码,它是匿名和可滥用的。我想你可以通过IP锁定它,如果他们的IP是静态的。