Pregunta

Tengo un servicio WCF muy simple que me gustaría exponer públicamente. Creé el servicio y lo configuré en nuestro servidor sin mucha molestia. El problema es que podemos usar el servicio desde nuestra red privada, pero cuando intentamos usarlo desde fuera de la red, se produce el siguiente error:

  

La negociación de la Interfaz del proveedor de soporte de seguridad (SSPI) falló.

Investigué un poco y parece que WCF usa la autenticación de Windows de forma predeterminada. Me gustaría cambiarlo para que no use autenticación, pero no estoy completamente seguro de cómo. Así es como se ve mi configuración ahora.

<system.serviceModel>
    <services>
        <service behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior"
         name="XX.ZZ.WebService.MyService">
            <endpoint  address="" binding="wsHttpBinding" contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="XX.ZZ.WebService.MyServiceBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Agradecería algunos consejos o empujones en la dirección correcta.

¿Fue útil?

Solución

Bueno, su servicio utiliza wsHttpBinding, que de forma predeterminada requerirá credenciales de usuario de Windows, que obviamente sus usuarios externos no tendrán. No es WCF en sí mismo el que usa las credenciales de Windows de manera predeterminada (como usted dice), sino realmente este enlace en particular (wsHttpBinding); otros pueden tener por defecto otras configuraciones.

Tienes un par de opciones:

  • configure wsHttpBinding (que es más bien " heavy-weight ") para no usar ninguna seguridad, o para usar la seguridad de nombre de usuario / contraseña que los llamantes tendrían que proporcionar
  • use basicHttpBinding sin seguridad en su lugar (ese es el modelo ASMX, básicamente)

Para desactivar completamente la seguridad desde wsHttpBinding, inclúyalo en su configuración:

<bindings>
  <wsHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </wsHttpBinding>
</bindings>

y luego configure sus puntos finales para usar esa configuración de enlace:

<system.serviceModel>
    <services>
        <service name="XX.ZZ.WebService.MyService"
                 behaviorConfiguration="XX.ZZ.WebService.MyServiceBehavior">
           <endpoint address="" 
                     binding="wsHttpBinding" 
                     bindingConfiguration="NoSecurity" 
                     contract="XX.ZZ.WebService.IMyService">
            </endpoint>
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>

Puede hacer lo mismo con <basicHttpBinding> en lugar de <wsHttpBinding> si lo desea (no hay ningún beneficio en usar wsHttpBinding vs. basicHttpBinding, si desactiva la seguridad y todas las demás funciones más avanzadas que ofrece wsHttpBinding).

También hay una muy buena serie de publicaciones de blog que habla sobre los conceptos básicos de la seguridad de WCF en términos de cinco escenarios diferentes y típicos: ¡excelente lectura!

Marc

Otros consejos

Esto le brinda seguridad de nivel de transporte sin autenticación:

<configuration>  <system.serviceModel>
    <services>
      <service 
          name="Microsoft.ServiceModel.Samples.CalculatorService"
          behaviorConfiguration="CalculatorServiceBehavior">
        <endpoint address=""
                  binding="wsHttpBinding"
                  bindingConfiguration="Binding1" 
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>  </system.serviceModel>
</configuration>

Para otros escenarios, echaría un vistazo a Muestras de Microsoft WCF .

WCF puede ser un verdadero dolor a la hora de configurarlo. Eche un vistazo a WCFSecurity proporciona buenas muestras de trabajo para diferentes entornos de configuración.

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