none
Routingwcf 4.0 RRS feed

  • Pregunta

  • Hola:

    Tengo un servicio WCF que utiliza un custombinding con seguridad habilitada.

    Estoy diseñando un WCF Router. El asunto funciona bien mientras deshabilito la seguridad, pero en cuanto la habilito deja de funcionar. El asunto es que llevo horas buscando ejemplos y en todos los sitios los ejemplos que viene es sin seguridad. Si alguien conoce algún ejemplo o me puede guíar en la solución lo agradecería mucho.

     


    David Sisqués
    lunes, 18 de julio de 2011 21:26

Todas las respuestas

  • Hola David:

     

    Has mirado esto http://msdn.microsoft.com/en-us/magazine/cc546553.aspx

     

    Saludos,


    phurtado
    martes, 19 de julio de 2011 9:31
  • Este ejemplo que me envías es de WCF 3.5. Se supone que con WCF 4.0 debería ser más fácil.
    David Sisqués
    martes, 2 de agosto de 2011 19:03
  • Hola David

    Te busque este ejemplo y lo pase, la verdad es que no mire que versión de Framework y por supuesto tampoco el titulo de la pregunta :). Lo siento. Voy a mirar si te encuentro algo.

     

    Saludos,

     


    phurtado
    martes, 2 de agosto de 2011 20:07
  • Hola David:

     

    Estoy diseñando un WCF Router. El asunto funciona bien mientras deshabilito la seguridad, pero en cuanto la habilito deja defuncionar.

     

    ¿puedes pasar los config para ver como están y trabajamos en ello? Yo también he estado buscando y lo que he encontrado es sin respuesta.

     

    Saludos,


    phurtado
    martes, 2 de agosto de 2011 20:29
  • Hola David:

     

    No se si has mirado esto:

     

    http://www.dotnetcurry.com/ShowArticle.aspx?ID=718

     

    Saludos,


    phurtado
    miércoles, 3 de agosto de 2011 18:59
  • Pedro, perdona que no te haya respondido antes pues he estado fuera.

    Los configs que tengo son los siguientes: (no me los deja insertar de una vez, así que lo haré en tres veces:

    Primero el servicio

     <system.serviceModel>
      <diagnostics wmiProviderEnabled="true">
       <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true" />
      </diagnostics>
      <services>
       <service behaviorConfiguration="WcfGlobal.SIGABehavior" name="WcfGlobal.SIGA">
        <endpoint binding="customBinding" bindingConfiguration="netTcpCustom"
         name="netTcpCustom" contract="WcfGlobal.ISIGA" listenUriMode="Explicit">
         <identity>
          <dns value="lonufe95" />
         </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" name="Metadatos"
         contract="IMetadataExchange" listenUriMode="Explicit" />
        <host>
         <baseAddresses>
          <add baseAddress="http://localhost:8740/" />
          <add baseAddress="net.tcp://localhost:8741/" />
         </baseAddresses>
        </host>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors>
        <behavior name="WcfGlobal.SIGABehavior">
         <serviceCredentials>
          <serviceCertificate findValue="lonufe95" storeLocation="CurrentUser" storeName="Root" x509FindType="FindBySubjectName"/>
          <userNameAuthentication userNamePasswordValidationMode="Custom" includeWindowsGroups="false" customUserNamePasswordValidatorType="WcfGlobal.UsuarioValidator, WcfGlobal"/>
         </serviceCredentials>
         <serviceThrottling maxConcurrentSessions="100"/>
         <serviceMetadata httpGetEnabled="true"/>
         <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
       </serviceBehaviors>
      </behaviors>
      <bindings>
       <customBinding>
        <binding name="netTcpCustom" closeTimeout="00:10:00" openTimeout="00:10:00" receiveTimeout="00:05:00" sendTimeout="00:00:30">
         <binaryMessageEncoding maxReadPoolSize="1000000000">
          <readerQuotas maxDepth="32" maxStringContentLength="1000000000" maxArrayLength="1000000000" maxBytesPerRead="4096" maxNameTableCharCount="1000000000"/>
         </binaryMessageEncoding>
         <reliableSession flowControlEnabled="true" inactivityTimeout="01:00:00" ordered="false"/>
    
         <security authenticationMode="SecureConversation" requireSecurityContextCancellation="false" >
          <secureConversationBootstrap authenticationMode="UserNameOverTransport">
           <localClientSettings maxClockSkew="23:59:59" sessionKeyRenewalInterval="10:00:00"/>
           <localServiceSettings maxClockSkew="23:59:59" sessionKeyRenewalInterval="10:00:00"/>
          </secureConversationBootstrap>
          <localClientSettings maxClockSkew="23:59:59" sessionKeyRenewalInterval="10:00:00"/>
          <localServiceSettings maxClockSkew="23:59:59" sessionKeyRenewalInterval="10:00:00"/>
         </security>
         <sslStreamSecurity requireClientCertificate="true"/>
         <tcpTransport maxBufferPoolSize="1000000000" maxReceivedMessageSize="1000000000" connectionBufferSize="60000" channelInitializationTimeout="00:05:00" maxBufferSize="1000000000" transferMode="Buffered"/>
        </binding>
       </customBinding>
      </bindings>
     </system.serviceModel>
    


    David Sisqués
    viernes, 5 de agosto de 2011 14:04
  • Ahora el cliente:

    <?xml version="1.0" encoding="utf-8"?>
    <system.serviceModel>
     <bindings>
      <customBinding>
       <binding name="netTcpCustom">
        <reliableSession acknowledgementInterval="00:00:00.2000000" flowControlEnabled="true"
          inactivityTimeout="01:00:00" maxPendingChannels="4" maxRetryCount="8"
          maxTransferWindowSize="8" ordered="true" reliableMessagingVersion="Default" />
        <security defaultAlgorithmSuite="Default" authenticationMode="SecureConversation"
          requireDerivedKeys="false" securityHeaderLayout="Strict" includeTimestamp="true"
          keyEntropyMode="CombinedEntropy" messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10"
          requireSecurityContextCancellation="false">
         <localClientSettings cacheCookies="true" detectReplays="false"
           replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
           replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
           sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
           timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
         <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00"
           maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
           negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
           sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
           reconnectTransportOnFailure="true" maxPendingSessions="128"
           maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
         <secureConversationBootstrap defaultAlgorithmSuite="Default"
           authenticationMode="UserNameOverTransport" requireDerivedKeys="true"
           securityHeaderLayout="Strict" includeTimestamp="true" keyEntropyMode="CombinedEntropy"
           messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10">
          <localClientSettings cacheCookies="true" detectReplays="false"
            replayCacheSize="900000" maxClockSkew="00:05:00" maxCookieCachingTime="Infinite"
            replayWindow="00:05:00" sessionKeyRenewalInterval="10:00:00"
            sessionKeyRolloverInterval="00:05:00" reconnectTransportOnFailure="true"
            timestampValidityDuration="00:05:00" cookieRenewalThresholdPercentage="60" />
          <localServiceSettings detectReplays="false" issuedCookieLifetime="10:00:00"
            maxStatefulNegotiations="128" replayCacheSize="900000" maxClockSkew="00:05:00"
            negotiationTimeout="00:01:00" replayWindow="00:05:00" inactivityTimeout="00:02:00"
            sessionKeyRenewalInterval="15:00:00" sessionKeyRolloverInterval="00:05:00"
            reconnectTransportOnFailure="true" maxPendingSessions="128"
            maxCachedCookies="1000" timestampValidityDuration="00:05:00" />
         </secureConversationBootstrap>
        </security>
        <binaryMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
          maxSessionSize="2048">
         <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
           maxBytesPerRead="4096" maxNameTableCharCount="16384" />
        </binaryMessageEncoding>
        <sslStreamSecurity requireClientCertificate="true" />
        <tcpTransport manualAddressing="false" maxBufferPoolSize="10000000"
          maxReceivedMessageSize="10000000" connectionBufferSize="8192"
          hostNameComparisonMode="StrongWildcard" channelInitializationTimeout="00:00:05"
          maxBufferSize="10000000" maxPendingConnections="10" maxOutputDelay="00:00:00.2000000"
          maxPendingAccepts="1" transferMode="Buffered" listenBacklog="10"
          portSharingEnabled="false" teredoEnabled="false">
         <connectionPoolSettings groupName="default" leaseTimeout="00:05:00"
           idleTimeout="00:02:00" maxOutboundConnectionsPerEndpoint="10" />
        </tcpTransport>
       </binding>
      </customBinding>
     </bindings>
     <client>
        <endpoint address="net.tcp://localhost:8741/" binding="customBinding"
        bindingConfiguration="netTcpCustom" contract="GlobalService.ISIGA" behaviorConfiguration="via"
        name="netTcpCustom">
       <identity>
        <dns value="lonufe95" />
       </identity>
      </endpoint>
     </client>
     <behaviors>
      <endpointBehaviors>
       <behavior name="via">
          <clientVia viaUri="net.tcp://localhost:9010/RouterGlobal" />
       </behavior>
      </endpointBehaviors>
     </behaviors>
    </system.serviceModel>
    


    David Sisqués
    viernes, 5 de agosto de 2011 14:06
  • Y finalmente el router

    <system.serviceModel>
      <services>
       <service name="System.ServiceModel.Routing.RoutingService" behaviorConfiguration="ConfiguracionRutas" >
        <host>
         <baseAddresses>
          <add baseAddress="net.tcp://localhost:9010/RouterGlobal"/>
          <add baseAddress="http://localhost:7010/RouterGlobal"/>
         </baseAddresses>
        </host>
        <endpoint binding="customBinding" name="router" bindingConfiguration="EnlaceGlobal"
             contract="System.ServiceModel.Routing.IDuplexSessionRouter"  >
      
        </endpoint>
       </service>
      </services>
      <behaviors>
       <serviceBehaviors >
    
        <behavior name="ConfiguracionRutas">
         <routing filterTableName="TabladeFiltros"/>
         <serviceMetadata httpGetEnabled="True"/>
         <serviceDebug includeExceptionDetailInFaults="True"/>
         <!--<serviceCredentials>
          <serviceCertificate findValue="lonufe95" storeLocation="CurrentUser" storeName="Root" x509FindType="FindBySubjectName"/>
         </serviceCredentials>-->
         <serviceThrottling maxConcurrentSessions="100"/>
        </behavior>
    
    
       </serviceBehaviors>
    
      </behaviors>
      <routing>
     
       <filterTables>
        <filterTable name="TabladeFiltros" >
         <add filterName="RutaBase" endpointName="PrincipalServiceEndpoint" priority="1"/>
        </filterTable>
       </filterTables>
       <filters>
        <filter name="RutaBase" filterType="MatchAll" />
       </filters>
      </routing>
      <bindings>
       <customBinding>
       
         <binding name="SSLPassThru">
          <tcpTransport manualAddressing="true"/>
         </binding>
        <binding name="EnlaceGlobal">
         <!--<binaryMessageEncoding/>-->
         <tcpTransport manualAddressing="true"/>
        </binding>
        </customBinding>
       <!--<customBinding>
        <binding name="EnlaceGlobal">
         --><!--<binaryMessageEncoding/>--><!--
         <tcpTransport manualAddressing="true"/>
        </binding>
       </customBinding>-->
      
      </bindings>
      <client>
       <endpoint address="net.tcp://localhost:8741" binding="customBinding" bindingConfiguration="SSLPassThru" contract="*" name="PrincipalServiceEndpoint" />
    
      </client>
     </system.serviceModel>
    
    Todos los ejemplos que veo por ahí son con la seguridad deshabilitada. Lo que yo busco es que el servicio router se comporte de manera similar a un router hardware, es decir que solamente controle hasta la capa 3 del modelo ISO. Y sea transparente en cuanto a seguridad y demás. Supongo que será posible...


    David Sisqués
    viernes, 5 de agosto de 2011 14:07
  • Hola David:
    Lo que yo busco es que el servicio router se comporte de manera similar a un router hardware
    Todo lo que suena a h y no es Software me pone los pelos de punta y me da miedo por si lo rompo:)
    Voy a intentar habilitar la seguridad 
    Una cosa más, cuando habilitas seguridad se produce un exception. Puedes pasar lo siguiente:
    1. Exception Mensaje y Tipo.
    2. InnerException Mensaje y Tipo.
    3.StackTrace.
    Perdón por las molestias :)
    Saludos,

    phurtado
    viernes, 5 de agosto de 2011 14:55
  • Desde luego que no es una molestia, Pedro.

    Ahí va (innerException is nothing):

    Exception: La actualización solicitada no es compatible con 'net.tcp://localhost:9010/RouterGlobal'. Puede deberse a enlaces no coincidentes (por ejemplo, que la seguridad esté habilitada en el cliente pero no en el servidor).

    StackTrace:

    Server stack trace:

    en System.ServiceModel.Channels.ConnectionUpgradeHelper.DecodeFramingFault(ClientFramingDecoder decoder, IConnection connection, Uri via, String contentType, TimeoutHelper& timeoutHelper)

    en System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.SendPreamble(IConnection connection, ArraySegment`1 preamble, TimeoutHelper& timeoutHelper)

    en System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.DuplexConnectionPoolHelper.AcceptPooledConnection(IConnection connection, TimeoutHelper& timeoutHelper)

    en System.ServiceModel.Channels.ConnectionPoolHelper.EstablishConnection(TimeSpan timeout)

    en System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan timeout)

    en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)

    en System.ServiceModel.Channels.LayeredChannel`1.OnOpen(TimeSpan timeout)

    en System.ServiceModel.Channels.SecurityChannelFactory`1.ClientSecurityChannel`1.OnOpen(TimeSpan timeout)

    en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)

    en System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.SyncWaiter.TryGetChannel()

    en System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.SyncWaiter.TryWait(TChannel& channel)

    en System.ServiceModel.Channels.ReliableChannelBinder`1.ChannelSynchronizer.TryGetChannel(Boolean canGetChannel, Boolean canCauseFault, TimeSpan timeout, MaskingMode maskingMode, TChannel& channel)

    en System.ServiceModel.Channels.ReliableChannelBinder`1.Send(Message message, TimeSpan timeout, MaskingMode maskingMode)

    en System.ServiceModel.Channels.SendReceiveReliableRequestor.OnRequest(Message request, TimeSpan timeout, Boolean last)

    en System.ServiceModel.Channels.ReliableRequestor.Request(TimeSpan timeout)

    en System.ServiceModel.Channels.ClientReliableSession.Open(TimeSpan timeout)

    en System.ServiceModel.Channels.ClientReliableDuplexSessionChannel.OnOpen(TimeSpan timeout)

    en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)

    en System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan timeout)

    en System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)

    en System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel channel, TimeSpan timeout)

    en System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan timeout, CallOnceManager cascade)

    en System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpan timeout)

    en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)

    en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)

    en System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)

    en System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

    Exception rethrown at [0]:

    en System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

    en System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

    en ClienteGlobal.GlobalService.ISIGA.NombreParaMostrarEnGlobal(String usuario)

    en ClienteGlobal.GlobalService.SIGAClient.NombreParaMostrarEnGlobal(String usuario) en C:\CC3152\SIGAGLOBAL15\WcfGlobal\ClienteGlobal\ClienteGlobal\Service References\GlobalService\Reference.vb:línea 4118

    en ClienteGlobal.Window1.AbreProxyGlobal() en C:\CC3152\SIGAGLOBAL15\WcfGlobal\ClienteGlobal\ClienteGlobal\Window1.xaml.vb:línea 84


    David Sisqués
    lunes, 8 de agosto de 2011 20:40
  • Hola David,

     

    Con lo que has pasado y basando en el texto del exceptión 

    Exception: La actualización solicitada no es compatible con 'net.tcp://localhost:9010/RouterGlobal'. Puede deberse a enlaces no coincidentes (por ejemplo, que la seguridad esté habilitada en el cliente pero no en el servidor). 

    Y en la configuración de los servición veo que estás delegando la seguridad al Servidor, cuando lo lógico es que esa delegación la tuviese el Router.

    Piensa que la llamada es Cliente->Router->Sercvicio. Por ninguún sitio del Router veo Seguridad.

     

    De todas formas e investigando sobre este tema y cuando creía que lo tenía solucionado basándome en este link http://www.codeproject.com/script/Articles/ViewDownloads.aspx?aid=97650 entonces me encontré al igual que tú con una muro de roca estas entradas en el foro me ha hecho tomar una decisión,  que vayas directamente a soporte y que te cuenten http://connect.microsoft.com/

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/0e3da14f-f788-4760-be02-4b6d72b729af/

     

    http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/40c1451b-c130-41bc-84be-5dc436698aeb/

     

    Piensa que yo estuve como tú en mi primera intervención en un el foro y al final descolge el teléfono :)

     

    http://social.msdn.microsoft.com/Forums/es-ES/windowsazuresecurity/thread/69395a86-b99a-428d-bf55-72042cb73d5b

     

    Eso sí me costo un mes resolverlo. Te recomiendo que pongas la incidencia en  http://connect.microsoft.com/, o lo mismo lo has resuelto y nos informas  como lo has hecho:) 

     

    Te prometo que llevo con tu tema dos día,probando y hecho de menos una simple tabla que diga

     

    RoutingService  BasicHttpBindinding Autentication Basic,etc,etc

    Sí o Yes                  Sí o Yés                No soportada

     

    Que facil, pero no encuentro esa tabla para pasartela.

     

    Sigue mi consejo vete directamente a http://connect.microsoft.com/,  pero como aprendras algo que los demas no sabemos te busco :)

     

    Lo siento me falta tiempo para resolverte este problema :)

     

    Saludos,

     

     

     

     

     


    phurtado
    miércoles, 10 de agosto de 2011 15:44
  • Muchas gracias, Pedro:

     

    Vamos por partes:

    Entiendo que delegar la seguridad en el servidor es lo correcto. Pretendo utilizar el router para dar redundancia al servicio. Tengo varios servidores y me conecto al primero que funciona. Si cae voy al siguiente. Puede haber casos en los que por falta de dinero solamente haya un servidor y entonces no necesito router.

    Además, supongo que si el router es totalmente transparente la operación de enrutado será más sencilla.

    Otra cosa, que yo tampoco he visto en ningún sitio es si es posible hacerlo.

     

    Si, supongo que les tendré que preguntar y ya pegaré aquí la respuesta.

     

    Muchas gracias

     

    David Sisqués

     


    David Sisqués
    miércoles, 10 de agosto de 2011 16:19
  • Hola;

    David pregunta que es la respuesta, o por lo menos la que yo se , falta documentación o es muy difícil de encontrar.

     

    Sigo investigando, por aquello de aprender:).

     

    Mira este link, por si te sirve alguna idea http://msdn.microsoft.com/library/ms751514.aspx

     

    Yo lo he descargado y he visto cosas interesantes, pero de seguridad la misma que mi casa, las puertas abiertas :)

    Lo siento(:

    Saludos,

     


    phurtado
    miércoles, 10 de agosto de 2011 16:28