2010-01-14 6 views
1

J'essaie d'authentifier les appels à un service WCS DataServices via Silverlight. Essentiellement, lorsqu'un utilisateur se connecte ils obtiennent une table de hachage qui devrait être intégré dans les en-têtes de chaque demande aux WCF DataServices. Actuellement utiliser cela comme une vérification par une méthode de QueryInterceptor par exempleAuthentification des services de données WCF

[QueryInterceptor("Orders")] 
    public Expression<Func<Orders,bool>> OnQueryOrders() 
    { 
     string hash = WebOperationContext.Current.IncomingRequest.Headers.Get("MyHeader"); 

     if(!TestHash(hash)) 
     { 
      return o => false; 
     } 
     else 
     { 
      return o => true; 
     } 
    } 

Cela semble être le moyen le moins efficace pour y parvenir. Existe-t-il un hook dans les services de données WCF avant l'exécution d'une requête que vous pouvez utiliser pour annuler une demande? Gardez à l'esprit que ce service est sans état et n'a pas accès à la session.

Répondre

5

En fait, je pense que j'ai résolu ce problème moi-même. En remplaçant la commande OnStartProcessingRequest, je peux lancer une exception si elle ne convient pas par ex.

protected override void OnStartProcessingRequest(ProcessRequestArgs args) 
    { 
     if (string.IsNullOrEmpty(WebOperationContext.Current.IncomingRequest.Headers.Get("MyMagicHeader"))) 
     { 
      throw new DataServiceException(404, "Access denied!"); 
     } 
     else 
     { 
      base.OnStartProcessingRequest(args); 
     } 
    } 
+1

YOu devrait retourner un 403 (interdit) au lieu d'un 404 (non trouvé) –

+0

Awesome! Pourquoi ne pouvons-nous pas le faire pour l'authentification au lieu de l'authentification de base de base stupide. C'est beaucoup plus sûr, n'est-ce pas? Je peux crypter un message ou un jeton et le faire valider sur le serveur. – gideon

0

Avez-vous considéré les inspecteurs de message WCF? Je pense (non garanti) l'inspecteur de message sera frappé avant l'intercepteur de requête pour et vous pouvez vérifier les en-têtes et vérifier les utilisateurs valeur hashed. Voici un bon lien avec info sur Writing Message Inspectors