Pregunta

Algunos antecedentes:  para proporcionar autenticación, estoy usando certificados en el lado del cliente y el servidor (WCF) y uso un certificado para todos los clientes (cargarlo manualmente desde el directorio de la aplicación, no es la forma más segura, pero no requiere administrar el almacenamiento y la creación de certificados instalación más difícil):

        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)});

Esto es del lado del cliente, y la configuración del host del lado del servidor se ve así:

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});
    }

Eso funciona bien y permite firmar mensajes, pero en cuanto al modo de seguridad configurado de la siguiente manera:

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

Pero necesito

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

de alguna manera para obtener WindowsIdentity en ServiceSecurityContext.  El modo de seguridad mixto (Transporte y Mensaje) no es útil, porque no sé por qué, pero incluso si configuro las credenciales del cliente de Windows en la configuración para la infraestructura del modo de transporte, intenta establecer una conexión SSL.

¿Alguna idea?


Los certificados se utilizan para la firma de mensajes, es decir. demostrando que el otro lado es cliente real o servicio (man-in-the-middle). Pero la autorización en el sistema que se desarrolla depende parcialmente de WindowsIdentity en ServiceSecurityContect. Todo lo que quiero incluir WindowsIdentity en sec.context, mientras que PrimaryIdentity es X509CertIdentity. Así que necesito saber en el lado del servidor qué usuario de dominio solicitó la operación del servicio.

¿Fue útil?

Solución

Pruebe este enlace re: Suplantación de identidad:

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

sección sobre "Asignación de un certificado de cliente a una cuenta de Windows" parece lo que busca.

con configuración en el cliente:

authentication mapClientCertificateToWindowsAccount="true" 

Código de cliente:

'Cree un enlace que establezca un certificado como el tipo de credencial del cliente.

Dim b As WSHttpBinding = New WSHttpBinding()

b.Security.Message.ClientCredentialType = MessageCredentialType.Certificate

'Cree un host de servicio que asigne el certificado a una cuenta de 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

Espero que ayude

Otros consejos

Si está utilizando seguridad de mensajes con certificados en cada extremo que lo aseguran, no estoy seguro de por qué necesitaría una identidad de Windows. ¿Cuál es el razonamiento detrás de eso?

Tal vez este enlace sea útil - secciones 6 y amp; 7 tienen detalles de la configuración para la autenticación del certificado, que funciona de manera similar a SSL:

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top