在DMZ上只展示一些服务方法

时间:2010-08-02 10:25:20

标签: c# .net wcf web-services

我有一个内部网络服务,可以公开给定任务的费率。目前有一项服务暴露:

  • 货币 - 添加,编辑,删除,SelectById
  • 国家/地区 - 添加,修改,删除,SelectById
  • 任务 - 添加,编辑,删除,SelectById
  • 费率 - 添加,修改,删除,选择所有,SelectById - (* 1)搜索
  • 参考数据(货币,国家,用户,任务......) - SelectAll
  • 用户 - 添加,编辑,删除,SelectById

(* 1)这只需要并执行SQL查询(我知道这是一个SQL注入的噩梦!我没有写这个)

我被要求在有人决定通过我们的防火墙将其暴露到DMZ之前审查该服务,即使他们告诉我防火墙规则将阻止攻击我拒绝允许此服务暴露。

希望信息的应用程序只需要对数据进行只读访问,我建议我们生成一个更安全的外观(可能使用WCF),只显示所需信息并安排彻底检修系统的。

我的建议是将服务分解为一系列特定的接口:

  • 货币
  • 国家
  • 任务
  • 价格
  • 用户

但是,鉴于我只需要DMZ中的只读数据,将每个服务分解为只读服务合同和可写服务合同是有意义的,例如:对于货币:

public interface ReadOnlyCurrencyService
{
    IEnumerable<Currency>GetAll();
    Currency GetById(int id);
}

public interface CurrencyService : ReadOnlyCurrencyService
{
    void Add(Currency currency);
    void Update(Currency currency);
    void Delete(Currency currency);
}

public class CurrencyServiceLAN : CurrencyService
{
}

通过这种方式,我们只能将货币服务的只读部分作为DMZ-LAN边界的端点公开,但使用相同的服务会在LAN内公开服务的可写部分。

只是想知道是否有人有任何想法/意见/不同方法

1 个答案:

答案 0 :(得分:1)

在不知道底层数据模型的外观或构造方式的情况下,我提出的一个建议是考虑WCF数据服务。如果您希望在实体模型之上构建一系列CRUD和搜索服务,WCF-DS可能是一种有用的方法。

创建只读服务非常简单,因为您必须创建一个将您的实体公开为IQueryable的数据上下文,这对roll on your own来说并不难。如果您正在使用实体框架,那么为您照顾它会更容易。您甚至可以将这些IQueryable公开的实体创建为一个数据服务(.svc)并对其进行配置,使这些实体只是只读的。

您可以创建第二个服务来处理内部用途的更新(和读取)。可更新服务将要求您实现IUpdateable,这比实现IQueryable更复杂(除非您使用EF,然后您可以免费获得它 - 可以这么说)。

我在WCF-DS中找到的好处是CRUD操作的管道系统适合您,然后您可以更加专注于安全性和一次性服务方法,而不是处理基本的CRUD码。此外,返回的数据采用标准格式(OData),并且可以作为XML或JSON返回。

总的来说,我喜欢这个框架并将其视为新的类似CRUD的项目。另请注意,我主要使用的是.NET 4。

希望这个观点有所帮助。如果您有其他问题,请告诉我。祝你好运!