2008-10-29 5 views
5

Mon service WCF utilise wsHttpBinding et fonctionne très bien du client lorsque le service est gerenated par le client en utilisant les options par défaut comme suit:WCF - changer les résultats d'adresses de point final dans SecurityException

RServiceClient R = new RServiceClient(); 

Cependant, à un moment donné, je « ll faut être en mesure de préciser l'emplacement du service, probablement en changeant l'adresse de noeud final comme suit:

RServiceClient R = new RServiceClient(); 
R.Endpoint.Address = new EndpointAddress(new Uri "http://xxx.xxxx.xxx:80/RServer/RService.svc")); 

Cependant, quand je préciser le point final exact, je reçois un SecurityNegotiationException: System.ServiceModel. S ecurity.SecurityNegotiationException was unhandled Message = "L'appelant n'a pas été authentifié par le service." Source = "mscorlib" ....

Le service WCF s'exécute sur IIS et dispose d'un accès anonyme activé sous l'administration IIS. En outre, cette erreur se produit lorsque le client est exécuté à partir de la même machine que le service sous un compte administrateur - je n'ai pas encore eu la partie effrayante de l'exécuter sur le net pour le moment!

Des idées?

Répondre

8

Par défaut, wsHttpBinding utilise l'authentification Windows. Je ne suis pas sûr de savoir comment l'hébergement dans IIS affecte ce scénario. Si vous ne voulez pas que la sécurité soit activée, vous pouvez ajouter un élément pour la sécurité et définir l'élément de mode sur «Aucun» à la config aux deux extrémités pour désactiver le paramètre par défaut.

Je pense que cela peut faire l'affaire - j'ai ajouté la section pour wsHttpBinding et régler la bindingConfiguration de votre service pour pointer vers les propriétés de liaison nouvellement ajoutés:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="wsHttpBind"> 
      <security mode="None"> 
      <transport clientCredentialType="None" protectionLevel="EncryptAndSign" /> 
      <message clientCredentialType="None" algorithmSuite="Default" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="ServiceBehavior" 
      name="RService"> 
      <endpoint address="" 
       binding="wsHttpBinding" 
       bindingConfiguration="wsHttpBind" 
       name="RService" 
       contract="IRService"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" 
       binding="mexHttpBinding" 
       name="MetadataExchange" 
       contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehavior"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true"/> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 
+0

Merci une tonne ... sauvé moi ;) – kape123

0

Utilisez-vous MessageSecurity avec des certificats? cela pourrait être un problème de certificat (mauvais nom d'hôte, un certificat auto-signé ne est pas installé, etc ..)

0

Voici mon informations de configuration de service, j'utilise wsHttpBinding:

<system.serviceModel> 
    <services> 
    <service behaviorConfiguration="ServiceBehavior" name="RService"> 
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="" 
name="RService" contract="IRService"> 
<identity> 
    <dns value="localhost" /> 
</identity> 
</endpoint> 
<endpoint address="mex" binding="mexHttpBinding" name="MetadataExchange" 
contract="IMetadataExchange" /> 
    </service> 
</services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="ServiceBehavior"> 
       <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
       <serviceMetadata httpGetEnabled="true"/> 
       <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 
3

vérifier auprès de votre config :

...  
    <identity> 
     <dns value="localhost" /> 
    </identity> 
... 

afaik wsHttpBinding a sécurité des messages activée par défaut. et quand il vérifie contre la valeur de DNS "localhost" il échoue.

0

Supprimer le bloc d'identité n'a pas fonctionné, bien que ne me donner une idée: Si je change l'adresse de point final de:

 R.Endpoint.Address = new EndpointAddress(new Uri("http://bigpuss.homeip.net/RServer/RService.svc")); 

à

 R.Endpoint.Address = new EndpointAddress(new Uri("http://localhost/RServer/RService.svc")); 

alors tout fonctionne bien! Soo, c'est évidemment contrarié par l'adresse URL non locale. Y a-t-il d'autres zones dans la configuration où la sécurité est configurée?

Questions connexes