none
Duda WCF con binding wsHttpBinding y Self Signed Certificate RRS feed

  • Pregunta

  • Hola.

    estoy desarrollando una aplicacion en C# que necesito que se conecte a un servicio WCF alojado en IIS utilizando como binding wsHttpBinding utilizando custom(mi propia clase) tal como muestro en la configuración de mi Web.config

    <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceCredentials>
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFWSBinding.UserNameValidator,WCFWSBinding"/>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>

    la validación de las credenciales me funciona bien pero mi duda es en cuanto a como viaja la información de esas credenciales(username y password), mi configuración indica la seguridad que utilizo

     <bindings>
          <wsHttpBinding>
            <binding name="HttpBindingConfig">
              <security mode="TransportWithMessageCredential">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>

    Quiero saber si las credenciales que ingreso viajan de forma segura como parte del SOAP envelope o si estoy haciendo algo mal, de momento me encuentro en etapa de desarrollo y es un proyecto académico, aclaro pues se que lo mejor es pasar las credenciales utilizando un certificado debidamente validado por una empresa de certificación... pero yo me cree un self signed certificate en IIS, mi pregunta es: si utilizo ese certificado para la conexión WCF, debo especificarlo en el Web.config o al habilitar el https en IIS y tener la configuración

    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

    me utiliza automáticamente el certificado que yo he creado?

    pregunto porque he buscado en pagina de internet y veo que las personas utilizan esta configuración pero yo no se que especificar en la parte comentariada cuando se utiliza un self signed certificate

    <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceCredentials>
                  <!--<serviceCertificate findValue="WCFWSBinding"
                        storeLocation="LocalMachine"
                        storeName="CertificadoWCF"
                        x509FindType="FindBySubjectName" />-->
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFWSBinding.UserNameValidator,WCFWSBinding"/>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>

    gracias por cualquier ayuda, no se si es necesario pero les dejo la configuración que utilizo en Web.config y el código de la clase UserNameValidator que utilizo para validar las credenciales, hacer la observación que el servicio funciona sin necesidad de especificar el endpoint mex para la metadata, sera que debo incluirlo siempre o esta bien mi configuración?

    <?xml version="1.0"?>
    <configuration>
      <system.web>
        <compilation debug="true" targetFramework="4.0"/>
        <httpRuntime/>
      </system.web>
      <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="HttpBindingConfig">
              <security mode="TransportWithMessageCredential">
                <message clientCredentialType="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <services>
          <service name="WCFWSBinding.WSBinding">
            <endpoint address="" binding="wsHttpBinding" contract="WCFWSBinding.IWSBinding" bindingConfiguration="HttpBindingConfig"/>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
              <serviceCredentials>
                  <!--<serviceCertificate findValue="WCFWSBinding"
                        storeLocation="LocalMachine"
                        storeName="CertificadoWCF"
                        x509FindType="FindBySubjectName" />-->
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFWSBinding.UserNameValidator,WCFWSBinding"/>
              </serviceCredentials>
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="false" multipleSiteBindingsEnabled="true"/>
      </system.serviceModel>
      <system.webServer>
        <modules runAllManagedModulesForAllRequests="true"/>
        <directoryBrowse enabled="true"/>
      </system.webServer>
    </configuration>

    Clase UserNameValidator.cs

    using System.IdentityModel.Selectors;
    using System.IdentityModel.Tokens;
    
    namespace WCFWSBinding
    {
        public class UserNameValidator : UserNamePasswordValidator
        {
            public override void Validate(string userName, string password)
            {
                if (userName == "test" && password == "test")
                    return;
                throw new SecurityTokenException(
                    "Unknown Username or Password");
            }
        }
    }


    pabletoreto

    viernes, 18 de diciembre de 2015 20:27