2015-09-02 1 views
0

Lorsque j'exécute l'application consommatrice, elle me donne l'exception suivante: Le service demandé, 'https://localhost:53996/HistoricStatementsWS.HistoricStatements.svc' n'a pas pu être activé.utilisation du service WCF avec certificat auto-signé

et lorsque j'essaie d'entrer ce chemin dans le chrome, il est dit: Un enregistrement existe déjà pour l'URI 'https://ws20.intra.local:53996/HistoricStatementsWS.HistoricStatements.svc'.

Je ne sais pas comment me débarrasser de ces exceptions et j'ai déjà vécu beaucoup de forums.

côté serveur app.config

<system.web> 
<compilation debug="true" /> 
<membership defaultProvider="ClientAuthenticationMembershipProvider"> 
    <providers> 
    <add name="ClientAuthenticationMembershipProvider" type="System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" /> 
    </providers> 
</membership> 
<roleManager defaultProvider="ClientRoleProvider" enabled="true"> 
    <providers> 
    <add name="ClientRoleProvider" type="System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" serviceUri="" cacheTimeout="86400" /> 
    </providers> 
</roleManager> 
</system.web> 
<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttpEndpointBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<services> 
    <service behaviorConfiguration="behaviourHttps" name="HistoricStatementsWS.HistoricStatements"> 
    <endpoint address="" binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" 
     name="wsHttpEndpoint" contract="HistoricStatementsWS.IHistoricStatements" /> 
    <endpoint address="HistoricStatementsWS.HistoricStatements.svc" 
     binding="wsHttpBinding" bindingConfiguration="wsHttpEndpointBinding" 
     name="mexEndpoint" contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="https://localhost:53996/" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="behaviourHttps"> 
     <useRequestHeadersForMetadataAddress /> 
     <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" 
     httpsGetUrl="https://localhost:53996/HistoricStatementsWS.HistoricStatements.svc" 
     policyVersion="Policy15" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
</system.serviceModel> 
</configuration> 

côté client Webconfig

<configuration> 
<configSections> 
</configSections> 
<system.web> 
<compilation debug="true" targetFramework="4.5" /> 
<httpRuntime targetFramework="4.5" /> 
</system.web> 
<system.webServer> 
<directoryBrowse enabled="true" showFlags="Date,Time,Extension,Size" /> 
</system.webServer> 
<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="wsHttpEndpoint"> 
     <security mode="Transport"> 
     <transport clientCredentialType="Certificate" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<client> 
    <endpoint behaviorConfiguration="endpointBehavior" address="https://localhost:53996/HistoricStatementsWS.HistoricStatements.svc" binding="wsHttpBinding" 
    bindingConfiguration="wsHttpEndpoint" contract="IHistoricStatements.IHistoricStatements" 
    name="wsHttpEndpoint" /> 
</client> 
<behaviors> 
    <endpointBehaviors> 
    <behavior name="endpointBehavior"> 
     <clientCredentials> 
     <clientCertificate storeLocation="LocalMachine" storeName="My" findValue="00B192126A72D282D2" x509FindType="FindBySerialNumber"/> 
     <serviceCertificate> 
      <authentication certificateValidationMode="None" revocationMode="NoCheck" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
</system.serviceModel> 
</configuration> 

Répondre

0

Pour toute personne ayant même problème j'ai réussi à résoudre le problème en dirigeant mon ip 127.0.0.1 à mon domaine complet nom: computername.intra.local. J'ai changé localhost dans la configuration web du serveur à mon nom de domaine (computername.intra.local) et supprimé le préfixe de domaine de httpsGetUrl puisque l'adresse de base est également utilisée pour cette valeur, donc https://localhost:53996/ a été dupliqué. Bien qu'il y ait encore des valeurs en double et que la config ne soit toujours pas précise, au moins le wsdl est accessible depuis le navigateur. Le navigateur (sur mon ordinateur local) demande un certificat et s'authentifie avec succès.

Cependant, je n'ai toujours pas le savoir-faire pour atteindre le même URL à partir d'une machine différente sur le même réseau. J'ai installé les certificats racine et client comme ils sont sur ma machine locale et encore il donne cette erreur: 'La requête HTTP a été interdite avec le schéma d'authentification client' Anonymous '.' J'avais cette erreur sur mon local du côté de client mais l'a résolu en appelant le certificat par programme. Le même code sur la nouvelle machine ne fonctionne pas.

Le code est:

WSHttpBinding httpBinding = new WSHttpBinding(SecurityMode.Transport); 
httpBinding.Security.Transport.ClientCredentialType =  HttpClientCredentialType.Certificate; 
httpBinding.Security.Message.NegotiateServiceCredential = false; 
httpBinding.Security.Message.EstablishSecurityContext = false; 

var httpUri = new Uri("https://ws12.intra.local:53996/HistoricStatementsWS.Historicstatements.svc"); 
var httpEndpoint = new EndpointAddress(httpUri, EndpointIdentity.CreateDnsIdentity("")); 
var newFactory = new ChannelFactory<IHistoricStatements>(httpBinding, httpEndpoint); 
newFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "ws12.intra.local"); 
newFactory.Credentials.ServiceCertificate.SetDefaultCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindBySubjectName, "ws12.intra.local"); 

Je dois ajouter que sans proxy sont utilisés, 'Anonymous' est activée dans IIS avec IUSR utilisateur, le dossier racine a plein permissios à IUSR, IIS_IUSRS, réseau, Service réseau . Je veux d'abord se connecter à partir du navigateur sur la nouvelle machine car cela donne une erreur:

403 -Forbidden: Access is denied. You do not have permission to view this directory or page using the credentials that you supplied.

Vos réponses sont très appréciées.

Justin