Question

Quelques antécédents:  Afin de fournir une authentification, j'utilise des certificats côté client et serveur (WCF) et utilise un seul certificat pour tous les clients (en le chargeant manuellement à partir du répertoire de l'application - ce n'est pas le moyen le plus sûr, mais cela ne nécessite pas de gérer le stockage des certificats et de créer des installation plus difficile):

        AddressHeader hostHdr = AddressHeader.CreateAddressHeader(ServiceFactory.CLIENT_HOST_HEADER, ServiceFactory.NAMESPACE, hostName);
        builder.Headers.Add(hostHdr);
        builder.Identity = new X509CertificateEndpointIdentity(GetServiceCertificate(name));


        _factory = new ChannelFactory<T>(name, builder.ToEndpointAddress());
        _factory.Credentials.ClientCertificate.Certificate = GetClientCertificate(name);
        X509ServiceCertificateAuthentication auth = _factory.Credentials.ServiceCertificate.Authentication;

        auth.CertificateValidationMode =X509CertificateValidationMode.Custom;
        auth.CustomCertificateValidator = new CustomCertificateValidator(new[] {GetServiceCertificate(name)});

Ceci est côté client, et la configuration de l'hôte côté serveur ressemble à ceci:

private void CertificateSetup(ServiceHost host)
    {
        if (ServiceCertificate != null)
            host.Credentials.ServiceCertificate.Certificate = ServiceCertificate;

        X509ClientCertificateAuthentication authentication =
                        host.Credentials.ClientCertificate.Authentication;

        authentication.CertificateValidationMode =
            X509CertificateValidationMode.Custom;

        authentication.CustomCertificateValidator =
            new CustomCertificateValidator(new [] {ClientCertificate});
    }

Cela fonctionne bien et permet de signer des messages, mais dans la mesure où le mode de sécurité est défini comme suit:

      <security mode="Message">            
        <message clientCredentialType="Certificate" />
      </security>

Mais j'ai besoin de

string name = OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name;

pour obtenir WindowsIdentity dans ServiceSecurityContext.  Le mode de sécurité mixte (Transport et Message) n’est pas utile, car je ne sais pas pourquoi mais même si je configure Windows clientCredentials dans config pour l’infrastructure en mode partie transport, tente d’établir une connexion SSL.

Des idées ????

Les certificats sont utilisés pour la signature du message, c'est-à-dire. prouver que l'autre partie est soit un client réel, soit un service (homme du milieu). Mais l'autorisation dans le système en cours de développement repose partiellement sur WindowsIdentity dans ServiceSecurityContect. Tout ce que je veux-inclure WindowsIdentity dans sec.context, pendant que PrimaryIdentity est X509CertIdentity. J'ai donc besoin de savoir sur le côté serveur quel utilisateur de domaine a demandé le fonctionnement du service.

Était-ce utile?

La solution

Essayez ce lien concernant l'emprunt d'identité:

http://msdn.microsoft.com/en-us/library /ms730088.aspx

La section

sur "Le mappage d'un certificat client sur un compte Windows" semble être ce que vous cherchez.

avec config sur le client:

authentication mapClientCertificateToWindowsAccount="true" 

Code client:

'Créez une liaison qui définit un certificat en tant que type d'informations d'identification du client.

Dim b As WSHttpBinding = New WSHttpBinding()

b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate

'Créez un hôte de service qui mappe le certificat sur un compte Windows.

Dim httpUri As Uri = New Uri("http://localhost/Calculator")

Dim sh As ServiceHost = New ServiceHost(GetType(HelloService), httpUri)

sh.Credentials.ClientCertificate.Authentication.MapClientCertificateToWindowsAccount = True

L’espoir que cela aide

Autres conseils

Si vous utilisez la sécurité des messages avec des certificats à chaque extrémité, je ne sais pas trop pourquoi vous auriez besoin d'une identité Windows? Quel est le raisonnement derrière cela?

Peut-être que ce lien sera utile - sections 6 & amp; 7 contiennent des détails sur les paramètres de configuration pour l’authentification des certificats, qui fonctionne de la même manière que SSL:

http://www.codeproject.com/KB/WCF/wcf_certificates.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top