2010-04-16 5 views
1

J'ai donc essayé de configurer l'authentification par certificat pour mes clients et services. L'objectif final est de partitionner les données en fonction du certificat auquel un client se connecte (c'est-à-dire que le certificat devient ses informations d'identification dans le grand système et que ses données sont partitionnées en fonction de ces informations d'identification).WCF: SecurityNegotiationException lors de l'utilisation du client

J'ai réussi à le configurer du côté client et côté serveur. J'ai créé un certificat et une clé privée, les ai installés sur mon ordinateur et ai installé mon serveur de telle sorte que 1) il ait un certificat d'identification de service et 2) si un client se connecte sans fournissant un certificat basé sur un certificat l'exception est levée. Ce que j'ai alors fait était de créer un client simple et d'ajouter un certificat d'identification à la configuration et essayer d'appeler une opération simple sur le service.

Il semble que le client se connecte sur OK, et il semble que le certificat est accepté par le serveur, mais je reçois ceci:

SecurityNegotiationException:

« L'appelant n'a pas été authentifié par le service."

Cela me semble plutôt ambigu. Notez que j'utilise wsHttpBinding, qui est censé être par défaut Windows pour la sécurité du transport ... mais tous ces processus sont exécutés en tant que mon compte d'utilisateur pendant que je cours dans mon environnement de débogage.

Voici ma configuration du serveur:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="MyServiceBinding"> 
      <security mode="Message"> 
      <transport clientCredentialType="None"/> 
      <message clientCredentialType="Certificate"/> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint binding="wsHttpBinding" bindingConfiguration="MyServiceBinding" contract="IMyContract"/> 
     <endpoint binding="mexHttpBinding" address="mex" contract="IMetadataExchange"> 
      <identity> 
      <dns value="localhost"/> 
      </identity> 
     </endpoint> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="MyServiceBehavior"> 
      <serviceMetadata httpGetEnabled="true" policyVersion="Policy15" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
      <serviceCredentials> 
      <serviceCertificate storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" findValue="tmp123"/> 
      </serviceCredentials> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

Voici ma config client - note que j'utilise le même cert pour le client que j'utilise le service:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
      <binding name="WSHttpBinding_IMyService" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
       <security mode="Message"> 
        <!--<transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/>--> 
        <message clientCredentialType="Certificate" negotiateServiceCredential="true" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </wsHttpBinding> 
    </bindings> 
    <client> 
     <endpoint address="http://localhost:50120/UserServices.svc" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMyService" behaviorConfiguration="IMyService_Behavior" contract="UserServices.IUserServices" name="WSHttpBinding_IMyService"> 
      <identity> 
       <certificate encodedValue="Some RSA stuff"/> 
      </identity> 
     </endpoint> 
    </client> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="IMyService_Behavior"> 
      <clientCredentials> 
      <clientCertificate storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" findValue="tmp123"/> 
      </clientCredentials> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

Quelqu'un peut-il aider à donner un aperçu de ce qui pourrait être ici?

Merci,

Répondre

0

ne peut pas voir quelque chose d'évident mais il faut vérifier ce lien CodePlex: Message Security With Certificates Guide, pourrait voir quelque chose là-bas que vous êtes absent. Une chose que j'ai remarquée dans le guide était que le bloc de configuration du serveur identity est mis en commentaire.

+0

Oui, j'ai essayé de supprimer cela en vain - même problème. J'ai également essayé de générer un cert pour le client et un cert pour le service, également en vain. Je me demande comment le service sait ce que certs accepter ... il n'y a pas de mappage dans la config, il semble que ... est-ce juste des certificats de confiance à l'utilisateur qui exécute le service? –

Questions connexes