Comment définir la sécurité WCF à exiger le certificat du client?
J'ai de service WCF. Je demande des clients pour l'authentification avec certificat.
C'est la configuration du service:
<system.serviceModel>
<services>
<service name="FilmLibrary.FilmManager" behaviorConfiguration="FilmService.Service1Behavior">
<endpoint address="manager" name="certBinding" binding="basicHttpBinding" contract="FilmContract.IFilmManager" />
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="certBinding">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="FilmService.Service1Behavior">
<serviceCredentials>
<clientCertificate>
<authentication trustedStoreLocation="LocalMachine"
certificateValidationMode="PeerTrust" />
</clientCertificate>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Clé publique est installé dans LocalMachine, des Personnes de Confiance
Client configuration est comme suit:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="certBinding" closeTimeout="00:01:00" openTimeout="00:01:00"
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false"
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</basicHttpBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="certBehaviour">
<clientCredentials>
<clientCertificate findValue="SubjectKey" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName"/>
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="[...]/Service1.svc/manager"
binding="basicHttpBinding" bindingConfiguration="certBinding" behaviorConfiguration="certBehaviour"
contract="FilmsService.IFilmManager" name="certBinding" />
</client>
</system.serviceModel>
Clé privée est installé dans le Personnel, l'utilisateur actuel.
Sans la sécurité, le service fonctionne. Avec la sécurité activée - il pas. J'ai essayé plusieurs configurations et j'ai eu des erreurs telles que l'authentification a échoué ou que je dois mettre en service certificat de clientCredentials élément. Ce que je ne comprends pas parce que je ne veux pas authentifier service à tous.
OriginalL'auteur jlp | 2009-12-05
Vous devez vous connecter pour publier un commentaire.
Au lieu de
Je pense que vous êtes censé avoir
Vous n'êtes pas authentifier le service par la présente, au contraire, vous dites au service de la manière dont le client est authentifié.
OriginalL'auteur K2so
J'ai trouvé le guide suivant extrêmement utile et très détaillé.
https://notgartner.wordpress.com/2007/09/06/using-certificate-based-authentication-and-protection-with-windows-communication-foundation-wcf/
Il couvre la création du service, le client, les certificats et en ajustant les 2 configs.
Serveur:
Client:
Nous auto-rediriger toutes les requêtes HTTP vers HTTPS, nous devons donc utiliser TransportWithMessageCredential type de sécurité. Normal l'adresse Http en utilisant simplement un Message comme type de sécurité devrait également fonctionner.
OriginalL'auteur Tikall
J'ai été en mesure d'accomplir la même chose en utilisant un customBinding, comme ceci:
(J'ai omis les attributs non pertinents pour votre cas.)
Autant que
authenticationMode
, je pense que vous pouvez probablement utiliser l'un d'eux--lehttpsTransport
avecrequireClientCertificate
sont les parties importantes ici.OriginalL'auteur Lee