2009-11-26 4 views
0

J'ai un service WCF qui devra recevoir les informations d'identification du client et gérer certaines données basées sur les rôles, en fonction de ma méthode d'authentification. Les clients résideront sur de nombreux systèmes différents, et en tant que tels, chaque client aura un userID et un pw uniques. J'utilise basicHttpBinding et ai lu quelques articles, comme celui-ci, http://nirajrules.wordpress.com/2009/05/22/username-over-https-custombinding-with-wcf%E2%80%99s-channelfactory-interface/, qui décrivent le processus.WCF - Configuration de l'authentification client/serveur dans les en-têtes?

Donc, ce que je cherche, c'est si quelqu'un a un client/serveur complet configuré comme ça pour voir si je peux en tirer ma propre solution. Ce que je voudrais faire est de faire passer le nom d'utilisateur et le mot de passe dans les en-têtes pour chaque requête, en repassant une sorte de SecurityTokenValidationException en cas d'échec, ou en continuant à passer.

Merci.

MISE À JOUR

J'utilise le WSHttpBinding avec la configuration suivante sur le client et le serveur:

<wsHttpBinding> 
    <binding name="wsHttpEndpointBinding" > 
     <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Basic" /> 
     <message clientCredentialType="UserName" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 

Et l'appel vers le serveur du client comme suit:

ServiceReference1.ServiceClient myClient = new ServiceReference1.ServiceClient(); 

myClient.ClientCredentials.UserName.UserName = "billuser"; 
myClient.ClientCredentials.UserName.Password = "mypassword"; 

Response.Write("Data from WCF Service: " + myClient.GetData(1)); 

Je pense que j'ai besoin d'un coup de main pour relier le CustomUsernamePasswordValidator sur le serveur car je reçois toujours ting the '... n'a pas pu être activé.' Erreur.

Répondre

1

Etes-vous obligé d'utiliser basicHttpBinding? Cette liaison est uniquement destinée à prendre en charge les implémentations WS-BasicProfile héritées (ASMX). Si vos clients sont également .NET/WCF, je recommande fortement d'utiliser wsHttpBinding, qui fournit une pléthore d'options de sécurité hors de la boîte. Vous pouvez utiliser des certificats, un nom d'utilisateur/mot de passe, etc. avec le transport et/ou la sécurité des messages et vous n'avez pas besoin d'écrire vous-même les éléments de sécurité. Il suffit de configurer-et-aller (CAG).

Les informations d'identification de sécurité sont disponibles pour le service lui-même via OperationContext, au cas où vous auriez besoin d'y accéder directement depuis votre code. Cependant, si votre code a besoin d'y accéder, je vous recommande d'écrire un comportement pour extraire les informations pertinentes de OperationContext et les placer dans quelque chose de plus spécifique à l'application afin de ne pas avoir à référencer System.ServiceModel partout où vous devez accéder informations sur OperationContext.

+0

Lorsque je suis passé de basicHttpbinding à wsHttpbinding (liaison de point de terminaison = "wsHttpBinding" bindingConfiguration = "wsHttp") j'obtiens l'erreur, "Le service demandé ... n'a pas pu être activé. information." Comme il s'agit d'une solution hébergée, je n'ai pas accès au journal. Je le fais sur https. – ElHaix

+0

Si vous utilisez https, avez-vous configuré la sécurité du transport pour la liaison? La sécurité du transport signifie que le protocole de transport crypte le canal. Comme vous utilisez https, vous devez activer la sécurité du transport pour la liaison. Essayez de configurer cela et voyez si cela fonctionne. Vous aurez probablement besoin de voir le rapport d'exception complet pour que la sécurité fonctionne. Il est généralement un peu d'essai et d'erreur pour le mettre en marche ... ce n'est pas vraiment "difficile", mais pas "évident" la première fois que vous implémentez la sécurité pour un point de terminaison. – jrista

+0

Pour le wsHttpbinding à la fois pour le client et le serveur, j'ai défini security mode = "TransportWithMessageCredential", transport clientCredentialType = "Basic", message clientCredentialType = "UserName". Donc, par le message d'erreur, je sais qu'ils se parlent entre eux, mais pas correctement :). Je place également proxy.ClientCredentials.UserName.UserName et proxy.ClientCredentials.UserName.Password avant de faire l'appel de service (si je n'ai pas, c'est une autre erreur). – ElHaix

Questions connexes