2010-08-02 9 views
0

J'ai un service Web interne qui expose quel taux payer pour une tâche donnée. À l'heure actuelle il y a un seul service qui expose:Exposer seulement quelques méthodes de service à travers DMZ

  • Devises - Ajouter, Modifier, Supprimer, SelectById
  • Pays - Ajouter, Modifier, Supprimer, SelectById
  • Tâches - Ajouter, Modifier, Supprimer, SelectById
  • Tarifs - Ajouter, Modifier, Supprimer, SelectAll, SelectById - (* 1) Rechercher
  • données de référence (Devises, pays, utilisateurs, tâches ...) - SelectAll
  • utilisateurs - Ajouter, Modifier, Supprimer, SelectById

(* 1) Cela prend juste et exécute une requête SQL (je sais que c'est un cauchemar d'injection SQL! Je n'ai pas écrit ceci)

On m'a demandé de revoir le service avant que quelqu'un décide de l'exposer à travers nos pare-feu dans la DMZ et même s'ils me disent que les règles du pare-feu préviennent les attaques, je refuse d'autoriser ce service. être exposé. L'application qui veut l'information veut seulement l'accès en lecture seule aux données et je vais suggérer que nous produisons une façade beaucoup plus sûre (probablement en utilisant WCF) qui expose seulement l'information requise et planifie un complet révision du système.

Ma suggestion est de décomposer le service en une série d'interfaces spécifiques pour:

  • Devises
  • Pays
  • Tâches
  • Tarifs
  • Utilisateurs

Cependant, étant donné que je n'ai besoin que de données en lecture seule dans t La DMZ aurait-elle intérêt à décomposer chaque service en un contrat de service en lecture seule et un contrat de service en écriture, par ex. pour les devises:

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 
{ 
} 

De cette façon, nous pouvons exposer uniquement les parties en lecture seule du service de change comme un point final à travers la frontière DMZ-LAN, mais en utilisant le même service exposer les parties inscriptibles du service à l'intérieur du réseau local.

me demandais simplement si quelqu'un avait des pensées/commentaires/approches différentes

Répondre

1

Sans savoir ce que le modèle de données sous-jacentes ressemble ou comment il est construit, une suggestion que je dois considérer est peut-être WCF Data Services. Si vous cherchez à créer une série de services CRUD et de recherche au-dessus de votre modèle d'entité, WCF-DS peut être une approche utile.

La création des services en lecture seule est assez simple, car vous devez créer un contexte de données qui expose vos entités comme IQueryable, ce qui n'est pas trop difficile à roll on your own. Si vous utilisez Entity Framework, c'est beaucoup plus facile car cela est pris en charge pour vous. Vous pouvez même créer ces entités exposées IQueryable comme un service de données (.svc) et le configurer de sorte que ces entités soient uniquement en lecture seule.

Vous pouvez créer un deuxième service qui gère les mises à jour (et les lectures) à des fins internes. Le service pouvant être mis à jour nécessiterait l'implémentation de IUpdateable, qui est un peu plus complexe que l'implémentation de IQueryable (à moins que vous n'utilisiez l'EF, vous l'obtenez gratuitement - pour ainsi dire). La bonne chose que j'ai trouvée avec WCF-DS est que la plomberie pour les opérations CRUD est en place pour vous, et que vous vous concentrez ensuite plus sur la sécurité et les méthodes de service ponctuelles plutôt que sur les bases. Code CRUD. En outre, les données renvoyées sont dans un format standard (OData) et peuvent être renvoyées au format XML ou JSON.

Dans l'ensemble, j'ai aimé ce framework et je le considère pour de nouveaux projets de type CRUD. S'il vous plaît noter également que j'utilise principalement. NET 4.

Espérons que cette perspective aide. Laissez-moi savoir si vous avez d'autres questions. Bonne chance!

+0

Merci pour la réponse. Certes, WCF DS est utile pour les opérations simples CRUD que j'ai, il faudra regarder cela et voir si cela correspond au modèle de données. –

Questions connexes