2010-09-21 24 views
3

Problème
WCF obtient Accès refusé lorsque le consommateur essayer invoquer un appel de service WCF hébergés sur une machine virtuelle

System.ServiceModel.Security.SecurityAccessDeniedException : Access is denied. 

lignes Stack pertinentes (réduit)

Server stack trace: 
at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 

Exception rethrown at [0]: 
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 

Environnement
Machine de développement (hôte): Windows V ista, Visual Studio 2008, nUnit
machine de test (invité): Windows 2003, IIS, Windows 2003 Pare-feu (désactivé)
Virtual Machine: Virtual PC
réseau: Adaptateur Microsoft Loopback

Description de
Windows 2003 héberge un inventaire de service WCF, les services sont bien testés.
Lorsqu'un consommateur d'application s'exécute dans Windows 2003, tout fonctionne correctement.
Lorsqu'un consommateur d'application s'exécute sous Windows Vista (sous ce réseau virtuel), des problèmes de sécurité apparaissent. Il était donc nécessaire d'ajuster le service et d'inclure un certificat. La documentation a été suivie mais l'accès a toujours été refusé.

Objet
Aucun arrangement de sécurité sophistiqué est nécessaire - c'est tout simplement un ordinateur portable et la machine virtuelle. J'ai essayé de répliquer ce scénario officiel: http://msdn.microsoft.com/en-us/library/ms733938.aspx
Je veux effectuer des appels aux services hébergés sur Windows 2003 à partir de mon application sous Windows Vista OS à l'aide de l'application Unit Test (nunit). Les services déployés sur Windows 2003 sont bien testés.

CE QUI FONCTIONNE
Tout service à l'aide (ou webservices .asmx passé) fonctionne correctement.

Suspicion
Je crois qu'il doit être avec ce Windows Vista endigué. Le journal des événements Windows 2003 a des entrées d'audit réussies.

REGLAGES DE SERVICE

Le grand public - l'application nunit fonctionnant sous Windows Vista:

<system.serviceModel> 
<client> 
    <endpoint address="http://soa.homolog.com/RemoteService/RemoteService.svc" 
     binding="wsHttpBinding" 
     behaviorConfiguration="InternetEndpointBehavior" 
     bindingConfiguration="AnonymousBindingConfiguration" 
     contract="RemoteService.IRemoteService" 
     name="WSHttpBinding_IEmpresaService"> 
    <identity> 
     <dns value="homologCertificate" /> 
    </identity> 
    </endpoint> 
</client> 
<bindings> 
    <wsHttpBinding> 
    <binding name="AnonymousBindingConfiguration"> 
     <security mode="Message"> 
     <message clientCredentialType="None" />    
     </security> 
    </binding> 
</bindings> 
<behaviors> 
<endpointBehaviors> 
    <behavior name="InternetEndpointBehavior"> 
     <clientCredentials> 
     <serviceCertificate> 
      <authentication certificateValidationMode="None" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
</system.serviceModel> 

Le service hébergé sur IIS/Windows 2003:

<system.serviceModel> 
<serviceHostingEnvironment> 
    <baseAddressPrefixFilters> 
    <add prefix="http://soa.homolog.com" /> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 
<bindings> 

    <wsHttpBinding> 
    <binding name="BindingNoSecurity">   
     <security mode="Message"> 
     <message clientCredentialType="None"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="CompanyCoreBehavior"> 

     <serviceMetadata httpGetEnabled="true" /> 
     <serviceDebug 
       includeExceptionDetailInFaults="true" /> 
     <serviceThrottling 
       maxConcurrentCalls="500" 
       maxConcurrentInstances="500" 
       maxConcurrentSessions="500" /> 
     <serviceTimeouts 
       transactionTimeout="00:10:00" /> 

     <serviceCredentials> 
     <serviceCertificate 
        findValue="homologCertificate" 
        storeLocation="LocalMachine" 
        x509FindType="FindBySubjectName" 
        storeName="My"/> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

+0

Quel fournisseur de machine virtuelle utilisez-vous? Virtual PC ou VMWare? –

+0

Salut Chuck Haines, Virtual PC .. –

+0

Excellent description du problème! Puis-je vous demander pourquoi vous insistez pour utiliser la sécurité des messages alors que vous spécifiez None pour le certificat? – Aliostad

Répondre

0

Il s'agit d'une exception System.ServiceModel.Security. Il ne s'agit donc probablement pas d'un pare-feu ou d'un problème IIS.

Essayez de supprimer le code suivant du client:

<clientCredentials> 
    <serviceCertificate> 
     <authentication certificateValidationMode="None" /> 
    </serviceCertificate> 
    </clientCredentials> 

Et le code suivant à partir du serveur:

<serviceCredentials> 
    <serviceCertificate 
       findValue="homologCertificate" 
       storeLocation="LocalMachine" 
       x509FindType="FindBySubjectName" 
       storeName="My"/> 
    </serviceCredentials> 
+0

Désolé frère, j'ai commencé exactement comme vous le proposez. Et je crois que le personnel de la WCF n'est pas si interprétable, car il se sent dans les réseaux Windows avec un bon paramètre de sécurité et de politique, et pas seulement une machine virtuelle. –

0

Commencez par enabling WCF tracing sur le serveur. Le journal de suivi peut contenir un message d'erreur significatif. Activer message logging et voir s'il existe des différences évidentes entre les messages acceptés et ceux qui ne le sont pas. Bien que, honnêtement, je ne vois pas comment cela peut arriver dans votre cas.

+0

Compris. Bien que j'avais regardé ce scénario d'une communication très simple. Essayé consommateur et service dans la même machine par la suite le service a été déployé dans cette machine distante (sur le serveur virtuel). Donc, j'ai commencé à voir des exemples de scénarios Microsoft. Rien de tout cela n'a fonctionné. Je vais essayer votre approche un peu plus, étant donné que le calque de la WCF est une sorte de "aiguille dans une botte de foin". Fait intéressant à dire à nouveau que les services .asmx fonctionne fièrement. –