2010-11-29 29 views
2

J'ai deux sites Web hébergés sur le même serveur IIS. SiteA contient les services WCF auxquels SiteB doit accéder, ainsi que tout ce qui est authentifié sur le domaine.Configuration de la sécurité WCF (wsHttpBinding)

Le service est configuré avec un wsHttpBinding et donc je crois utilise la sécurité Windows par défaut. À l'heure actuelle, je peux appeler les services depuis une application de console fonctionnant sur ma machine locale, ainsi que depuis une application Web exécutée sur le serveur Web Visual Studio par défaut, donc je considère que l'authentification fonctionne.

Toutefois, lorsque SiteB tente d'accéder aux services, il échoue avec cette erreur: L'appelant n'a pas été authentifié par le service. SiteB s'exécute sur la même machine que SiteA donc je ne comprends pas pourquoi il n'a pas pu être authentifié. SiteB utilise l'authentification par formulaire et j'ai mappé l'accès anonyme à un utilisateur de domaine.

Voici les bits de configuration:

SiteA (service):

<system.serviceModel> 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service behaviorConfiguration="wcfServiceBehaviour" name="MyService"> 
       <endpoint address="" binding="wsHttpBinding" contract="IServiceContract" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="wcfServiceBehaviour"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 

SiteB (client):

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" /> 
    </client> 
</system.serviceModel> 
+0

Salut Xavier, mes excuses, je me suis trompé. J'avais clairement manqué ce morceau. – Aliostad

Répondre

1

Vous avez raison - wsHttpBinding configuré dans WCF utilisera l'authentification Windows par défaut.

Il est suggéré ici - WCF - changing endpoint address results in securityexception - que le bloc Identité ne fonctionne pas avec l'authentification Windows - essayez de le supprimer.

+0

Merci pour l'indice. J'ai supprimé le bloc d'identité, mais l'authentification ne fonctionne toujours pas. J'ai édité ma question pour refléter les changements. –

+1

Avez-vous envisagé d'utiliser NetNamedPipeBinding au lieu de wsHttpBinding? Cette liaison est sécurisée et optimisée pour le traitement par une même machine. Si vous avez toujours besoin de fournir un accès externe, vous pouvez conserver le wsHttpBinding en place (en supposant qu'il fonctionne pour les utilisateurs externes).Tout ce que vous devez faire est de changer le nom de la liaison et de changer http: // en net.pipe: //. –

+0

N'explique pas pourquoi cela n'a pas fonctionné mais c'est quand même une excellente suggestion! –

1

Lorsque SiteB emprunte l'identité d'un autre utilisateur, votre code spécifie-t-il le impersonation level? Je suppose que vous ne spécifiez pas un niveau d'emprunt d'identité suffisamment élevé. (La délégation est la plus élevée, permettant à SiteB de transmettre les autorisations à un service différent).

Je soupçonne que la réparation du code d'usurpation SiteB suffira à résoudre le problème.

Sinon, essayez passer le niveau d'emprunt d'identité autorisé au serveur:

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" 
       behaviorConfiguration = "ImpersonationBehavior" /> 
    </client> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="ImpersonationBehavior"> 
        <clientCredentials> 
         <windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level --> 
        </clientCredentials> 
       </behavior> 
      <endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 
+0

Merci pour la suggestion. L'application utilise l'authentification par formulaire, donc je ne pensais pas que l'usurpation d'identité aiderait dans ce cas. Je l'ai essayé de toute façon au cas où le but était d'usurper l'identité de l'utilisateur anonyme mais cela n'a pas aidé. Je vais prendre la suggestion de Greg et utiliser NetNamedPipeBinding, et laisser le wsHttpBinding pour les utilisateurs externes. –

0

Si vous utilisez un site'autonome comme moi, la façon d'éviter ce problème (comme décrit ci-dessus) est de stipuler côté hôte et côté client, le mode de sécurité wsHttpBinding = NONE.

Lors de la création de la liaison, à la fois sur le client et l'hôte, vous pouvez utiliser ce code:

Dim binding as System.ServiceModel.WSHttpBinding 
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None) 

ou

System.ServiceModel.WSHttpBinding binding 
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);