Question

WCF 4.0 a-t-il une classe / module analogique / quoi que ce soit pour la requérante de Kit de démarreur de WCF.

Était-ce utile?

La solution

Il n'y a rien qui ne soit rien qui en mappe 1-1, mais vous pouvez utiliser un IDISPatchMessageInspector à partir du noyau de WCF pour mettre en œuvre la plupart des scénarios pour lesquels le requérant le ferait.Le message chez http://blogs.msdn.com/b/carlosfigueira/archive/2011/04/19/wcf-extability-Message-Inspects.aspx a des informations détaillées sur les inspecteurs de messages.

Autres conseils

Je suis de retour avec une mise à jour.

J'arrive à évaluer la simplicité dans le code et après avoir résolu avec succès cette question, je ne peux pas dire que je préfère cela plus que la méthode de la chaîne de requête. Laissant tomber un seul appel dans chaque point d'extrémité de service qui appelle une méthode Authn à côté de la méthode AuthZ semble plus facile que certains pourraient croire.

Quoi qu'il en soit, assez d'opinions ... sur la solution. La solution est juste sous nos yeux sur Stackoverflow sur ce lien mais pas bien décrit dans notre contexte ... Je vais donc donner crédit à "user634119" pour le code d'échantillon trouvé ici: en-têtes d'opérationContext

Premièrement, nous devons ajouter un service de service à notre fichier web.config:

<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceAuthenticationManager serviceAuthenticationManagerType="WCF.BasicAuthorization, WCF"></serviceAuthenticationManager>
      <serviceAuthorization impersonateCallerForAllOperations="false" principalPermissionMode="Custom" serviceAuthorizationManagerType="WCF.BasicAuthentication, WCF">
      </serviceAuthorization>
    </behavior>
  </serviceBehaviors>
</behaviors>

Suivant Faire une classe (appelée BasicAuthorization tel que référencé dans le bloc ServiceBeHaviors ci-dessus):

//Authorize the call against the URI resource being requested...
public class BasicAuthorization : ServiceAuthorizationManager
{
    public override bool CheckAccess(OperationContext operationContext, 
    ref Message message)
    {
        //some code
    }
}

Suivant Faire une classe d'authentification:

// Authenticate the header signature as described in my previous post
public class BasicAuthentication : ServiceAuthenticationManager
{
    public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
        ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, 
        ref Message message)
    {
        //some code
    }
}

Dans la méthode d'authentification, utilisez HTTPequestMessageProperty pour extraire les détails de l'en-tête de la demande et effectuez les mêmes 3 étapes décrites dans ma première réponse.

Eduardo, vous avez demandé: @carlosfigueira: puis-je l'utiliser pour implémenter un sous-système d'authentification?

Je travaille sur ce même problème et j'ai au moins une solution (décrite ci-dessous) pour vous et une montée à venir basée sur l'en-tête d'autorisation (que je crois est celle que vous envisagez de "intercepter").

Le moyen le plus simple de sécuriser un point de terminal de programmation WebHTTP de WCF 4 est-ce:

  1. Émettez une clé secrète partagée et une clé API sur chaque client à utiliser comme des informations d'identification. La clé API est vraiment la même que celle d'un nom d'utilisateur.
  2. Exécutez tous les boutons finaux sur SSL pour vous assurer de toujours avoir une chaîne / un message / de sécurité de données
  3. exiger que les clients utilisent le secret partagé pour générer une chaîne de signature hachage HMAC-SHA1 (ou EQUIV) qui inclut une horodatage et leur clé API.
  4. exiger que le client passe tous les 3 d'entre eux en tant que paramètres Strings de requête dans chaque demande :
    • Signature
    • horodatage
    • clé API
    • Exemple: https://127.0.0.1/restendPoint?sig= {sigstring} & apkey= {apkey} & horodestamp= {Timeestamp} & Tous vos autres paramètres ici ...
    • de votre côté service, mettez en place une méthode d'authentification qui prend les 3 cordes puis:
      • lève la clé de l'API et renvoie le secret partagé du client que vous a dans une DB ou ailleurs.
      • Comparez l'horodatage contre DateTime.Now pour vous assurer que la demande n'est pas supérieure à 15 minutes de finir de réduire les attaques de replay.
      • Utilisation de ces 3 chaînes, recréez la chaîne de signature et comparez la vôtre à celle transmise par le client.
      • S'ils correspondent, le demandeur est authentique.

        Maintenant, la meilleure façon de le faire consiste à utiliser l'en-tête de demande d'autorisation HTTP de stocker ces 3 chaînes et d'avoir un processus mondial d'intercepteur-iSH sur toutes les demandes. Cela empêcherait le potentiel d'un point d'extrémité exposé sans bloc d'authentification (bien, au moins son moins probable peut-être).

        problème avec l'utilisation de la chaîne de requête pour transporter toutes ces informations est que la chaîne de requête a une longueur maximale 2K (qui varie selon le client / navigateur) et la chaîne de requête devient vraiment difficile à lire lors de la débogage ... mais il suffit de vous habituer à ça.

        Certains pensent une manière plus sophistiquée de faire ceci est un modèle STS où vous souhaitez que le client passe ces 3 chaînes d'authentification à un point d'extrémité de service de jeton de sécurité. Le message de réponse transmettrait un jeton de session que le client passerait à chaque appel au lieu des 3 cordes. Il est vrai que pour le client, il n'est pas nécessaire de générer une signature de hachage HMAC sur chaque appel, mais le côté serveur doit toujours authentifier le jeton et que le concept de session saute le comportement apatride reposant propre.

        Je ferai de mon mieux pour poster des blocs de code qui implémentent la chaîne de requête et les méthodologies d'en-tête d'autorisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top