Asp.net web api 如何在同一家公司的多个项目中高效地共享数据?

Asp.net web api 如何在同一家公司的多个项目中高效地共享数据?,asp.net-web-api,security,Asp.net Web Api,Security,我将构建两个Web API项目,它们将用于我们公司的其他Web/移动站点项目 Web API是面向公众的 无SSL 可以在jQueryAjax调用中使用 数据本身不是私有/敏感数据 Web API调用将在首页上的高流量站点上使用[例如,填充主页上的下拉列表] 所以我想要某种机制来限制我们公司项目的Web API调用,或者至少禁止某人使用我的公共Web API创建他们的网站或任何类型的攻击(如重播) 以下是我想到的几个方法 使所有Web API调用仅在Intranet内可访问[仅通过服务器端代

我将构建两个Web API项目,它们将用于我们公司的其他Web/移动站点项目

  • Web API是面向公众的
  • 无SSL
  • 可以在jQueryAjax调用中使用
  • 数据本身不是私有/敏感数据
Web API调用将在首页上的高流量站点上使用[例如,填充主页上的下拉列表]

所以我想要某种机制来限制我们公司项目的Web API调用,或者至少禁止某人使用我的公共Web API创建他们的网站或任何类型的攻击(如重播)

以下是我想到的几个方法

  • 使所有Web API调用仅在Intranet内可访问[仅通过服务器端代码访问Web API]。这将使我失去通过ajax访问它的便利性
  • 在每个请求中使用用户名和密码,但我们的网站不会使用HTTPS。因此,它违背了目的
  • 考虑过使用Nonce,但是当我的面向公众的页面上的Nonce过期时会发生什么呢?我该怎么刷新页面?我不能要求用户做一些事情,因为页面没有经过用户身份验证
  • 使用OAuth进行身份验证。它看起来很复杂,每一个请求都需要身份验证,我担心这会影响性能[因为我们的网站流量很大]
  • 只需使用uniqueID,并检查其来自的域。希望不会发生什么大事
  • 我想和5个人一起去。请告诉我你的建议。 提前谢谢

    编辑
    我们的网站不是https,只有只读请求。
    我主要关心的是性能。我不希望复杂的安全步骤减慢我们的公共WebAPI的速度,因为这将被我们公司内的许多web项目调用。

    免责声明-进行您自己的研究(并可能等待更多的答案),我不是安全专家,几分钟后我就想到了这一点

    计划将其作为一个开放api

    老实说,保护东西非常困难,你可以尽最大努力尝试,但实际上你说的是让任何人通过javascript访问api,你没有太多机会完全保护它。您在制作此api时所做的每一个决定都应该基于这样一个理念:任何人都可以访问它,除非您实现了真正的身份验证方案(例如,非自定义方案),否则不要发送任何私有数据

    如果您的数据没有那么重要,那么如果数据没有得到很好的保护就不重要了

    下一个从事这项工作的人可能会找到完成功能的最简单方法,很多安全漏洞都是在您不完全了解原始计划的情况下通过更新系统产生的

    基于令牌的身份验证

    允许您使用api的每个站点都会将一个唯一的id(guid)插入到数据库中,其中包含源站点、客户端ip和过期日期。根据页面的生命周期,这可能会很快过期,但这样做的成本会更高

    当javascript访问您的api并传递该令牌时,api只需检查令牌与数据库中的ip,并确保其未过期

    如果您可以使用某种标准形式的身份验证,甚至可以使用ASP.NET之类的加密cookie,那就更好了。我不相信这是可能的,如果你是跨域的

    检查IP应该有助于防止中间人攻击另一个站点试图允许用户使用你的API,这不会阻止他们直接使用它,并用信息做任何他们喜欢的事情。 您可以尝试限制api的速率,以防止其他站点使用它向其用户提供信息。这可以通过简单地限制您发出令牌的频率以及每个令牌允许发出的请求数量来实现

    CORS

    因为您可能正在使用跨域ajax调用,所以您可能需要研究称为CORS的东西。这将允许兼容浏览器进行跨域请求,对于不支持跨域请求的浏览器,您可能需要退回到jsonp。这也有助于消除支持跨站点脚本的浏览器中的跨站点脚本攻击。AFAIK这是一种浏览器技术,而不是服务器技术(除了http头),因此这同样不会阻止任何不遵守此规则的客户端,但它可以帮助保护您的用户

    防止CSRF

    )

    如果您允许更新任何数据,那么我强烈建议您考虑使用跨站点请求反伪造机制。也许MVC提供了一个令牌,您可以在cookie(来自api)中为用户提供一个唯一的值,并且还要求用户在向api发送的任何帖子中传递该值。这在服务器和客户端上都很容易实现,服务器不需要在会话中存储任何东西来实现这一点,这意味着只要cookie处于活动状态,它就可以工作。这使得恶意方很难让其他任何人对您的api执行请求。如果使用表单而不是ajax进行任何回发,则需要确保将令牌添加到回发值中。请记住,这不是一种身份验证方法,而是一种尝试防止CSRF的方法

    您可以将其与身份验证令牌相结合,但由于它依赖于发送cookie,因此这可能是不可能的

    拒绝服务攻击


    还要确保api方法不昂贵,以帮助阻止使用大量cpu时间的DOS攻击。当然,如果有人真的想关闭你的网站,他们可能仍然可以这样做,你的工作就是尝试限制他们的途径。

    如果你仍在寻找,你需要的是一种轻量级的消息验证方法,它将验证消息的真实性。在相当轻量级但仍然安全的算法(如
    SHA-1
    )中使用哈希键,您可以