Parte de un gran equipo
03 June 08 08:06 PM | mmonterroca | with no comments

 

El día de mañana es la presentación de mi amigo Rodrigo en el TechEd Developers 2008, por cierto él está haciendo una muy buena recopilación de lo que está sucediendo, no dejen de seguirlo en su blog

¡Que gusto es ser parte de un gran equipo!

Buenas nuevas..
19 May 08 01:24 AM | mmonterroca | with no comments

¡Como pasa el tiempo tan rápido!  les dejo una actualización breve de noticias.

 

La clínica de certificación va cada día mejor, recién hemos terminado el módulo 1 y esperamos tener listo el primer examen para finales de ésta semana. otra noticia importante en relación es la clínica es que hemos decido hacerla publica pero únicamente para el contenido, para poder presentar los exámenes y participar en el foro si será necesario registrarse, para consultar el contenido solo basta que ingreses a la aula virtual

 

La segunda emisión del PodWorx está disponible desde hace casi 15 días, si quieres agregarlo a tu cliente de Itunes puedes utilizar el siguiente url: itpc://feeds.feedburner.com/devworx . La tercera emisión la grabamos la semana pasada  espero que mañana ya este lista la producción para poder anunciarlo como es debido :D

Acabo de subir un screencast para la clínica, el tema es muy interesante por que trata de como crear un Dominio de Aplicación (Application Domain) para restringir código potencialmente inseguro o en el cual simplemente no confiamos, el url aquí: http://files.devworx.com.mx/Clinicas/70-536/DevWorx.ApplicationDomain.asx

 

Twitter se está convirtiendo en una herramienta que comienza a dar valor, algunas de las aplicaciones son:

  • Microblogin, en varias ocasiones me he detenido en publicar un post para poner una sola noticia  o simplemente un link de algo interesante, Twitter al ser una herramienta que solo soporta 140 caracteres es perfecta para este fin, como por ejemplo @SLMicroBlog
  • Alertas, existen portales que están comenzando a utilizar Twitter para hacer la notificación de noticias u alertas, ejemplo: @cnn
  • Comunicación, la parte "ligera" es enterarte que andan haciendo las personas de tu interés, familia, amigos, compañeros etc, ejemplo: @srbichi (Maic)

en fin, si quieren seguirme mi Twitter es @mmonterroca

Saludos!

Evento de lanzamiento de la Comunidad .NET D.F. y Developers Dot Net
08 May 08 12:58 PM | mmonterroca | with no comments

La Comunidad .NET de la Ciudad de México y DevelopersDotNet te invitan al evento de Lanzamiento.

Fecha:
13 de Mayo

Hora:
11 a.m. – 7.p.m

Lugar:
ITAM

Dirección:

Río Hondo # 1
Col. Progreso Tizapán
C.P. 01080 Del. Álvaro Obregón
México D.F.

Agenda:

11:00 a 12:30
Héctor Obregón -Interoperabilidad entre Código Nativo en C++ (con MFC), Windows Forms y WPF

12:30 a 2:00
Misael Monterroca - Silverlight 2.0 Beta 1

2:00 a 3:00
Tiempo disponible para salir a comer.

3:00 a 4:30
Miguel Ángel Moran - Nuevos elementos sintácticos con C# 3.0 y VB 9.0

4:30 a 5:45
Alfredo Ceballos – Experiencias de Usuario Enriquecidas en Web y Windows.

5:45 a 7:00
Raúl Guerrero –  SQL Server 2008

Mapa:

http://www.itam.mx/es/ubicacion/riohondo1.html
http://www.itam.mx/es/ubicacion/riohondo2.html

Compartiendo Forms Authentication entre diferentes aplicaciones web
25 February 08 02:36 PM | mmonterroca | 1 comment(s)

Introducción

Asp.net permite incorporar de una manera muy rápida la autenticación vía Forms Authentication, en este articulo veremos como configurar dos o más aplicaciones web diferentes para compartir el mismo token de autenticación generado.

 

Prerrequisitos

  • Contar con una aplicación web configurada correctamente con Forms authentication
  • Tener una segunda aplicación web en donde se necesite tener el mismo token de autentificación (es decir, no volverse a firmar nuevamente)

Escenario

Existe una aplicación web funcionando con Forms authentication(www.sitiowebficticio.com) , por cuestiones de diseño se decide separar dicha aplicación en dos diferentes sitios web mediante directorios virtuales  www.sitiowebficticio.com/App1 y www.sitiowebficticio.com/App2

El objetivo es que ambas aplicaciones web compartartan el mismo token de autenticación generado por Forms authentication, de esta manera el usuario solo tendría que escribir sus credenciales una sola vez.

 

Manos a la obra

En App1 y App2 abrir el web.config, debería tener algo similar a lo siguiente (asumiendo que ya se encuentra configurado Forms authentication):

 

   1: <connectionStrings>
   2:     <add name="MembershipCS" connectionString="Data Source=(local);Initial Catalog=kpmg;Integrated Security=true;"/>
   3: </connectionStrings>
   4: <system.web>        
   5:     <!--
   6:         The <authentication> section enables configuration 
   7:         of the security authentication mode used by 
   8:         ASP.NET to identify an incoming user. 
   9:     -->
  10:     <authentication mode="Forms"/>    
  11: <membership defaultProvider="SqlProv">
  12:         <providers>
  13:             <add name="SqlProv" type="System.Web.Security.SqlMembershipProvider,System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
  14:          connectionStringName="MembershipCS" 
  15:          enablePasswordRetrieval="false" 
  16:          enablePasswordReset="true" 
  17:          requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
  18:         </providers>
  19:     </membership>

Suponiendo que dentro de app1 y app2 existen dos folders en donde se le niega el acceso a usuarios anónimos el path seria el siguiente:

  1. Usuario accede a www.sitiowebficticio.com/App1/CarpetaSegura/PaginaSegura.aspx, forms autentication redirecciona a login.aspx para que el usuario ingrese sus credenciales
  2. El usuario ingresa sus credenciales, MemberShipProvider valida y login.aspx redirecciona a www.sitiowebficticio.com/App1/CarpetaSegura/PaginaSegura.aspx
  3. El usuario ahora quiere ingresar a App2, www.sitiowebficticio.com/App2/CarpetaSegura2/otrapaginasegura.aspx, forms authentication redirecciona a login.aspx pero de App2

¿Por que sucede este comportamiento si en ambas aplicaciones web tenemos exactamente la misma configuración?

Este comportamiento se debe a que el cookie que genera asp.net está encriptado y para generar la encriptación / des encriptación asp.net utiliza los valores especificados en los elementos validationKey y decryptionKey. Asp.net por defecto genera esas claves a nivel aplicación  de manera automatica, es por eso que cuando el usuario pasa de App1 a App2 el cookie no puede ser leio de manera correcta ya que las claves de encriptación son diferentes y por ende, se solicita nuevamente la autenticación ya que Forms authentication toma ese cookie como invalido al no poderlo desencriptar

 

Lo que haremos será especificar dichas claves, para ello crearemos una aplicación de consola que generara dichas claves criptograficas:

   1: using System.Security.Cryptography;
   2:  
   3: namespace GenerarClavesAspNet
   4: {
   5:     class Program
   6:     {
   7:         static void Main()
   8:         {
   9:             string decryptionKey = CrearClave(System.Convert.ToInt32(24));
  10:             string validationKey = CrearClave(System.Convert.ToInt32(64));
  11:  
  12:             Console.WriteLine("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>", validationKey, decryptionKey);
  13:  
  14:             Console.ReadKey();
  15:  
  16:         }
  17:  
  18:         static String CrearClave(int numBytes)
  19:         {
  20:             RNGCryptoServiceProvider service = new RNGCryptoServiceProvider();
  21:             byte[] buff = new byte[numBytes];
  22:  
  23:             service.GetBytes(buff);
  24:             return ConvertirString(buff);
  25:         }
  26:  
  27:         static String ConvertirString(byte[] bytes)
  28:         {
  29:             StringBuilder cadena = new StringBuilder(64);
  30:  
  31:             for (int counter = 0; counter < bytes.Length; counter++)
  32:             {
  33:                 cadena.Append(String.Format("{0:X2}", bytes[counter]));
  34:             }
  35:             return cadena.ToString();
  36:         }
  37:  
  38:     }
  39: }

 

Al ejecutar la aplicación obtedremos un resultado similar al siguiente (las claves son generadas aleatoriamente)

   1: <machineKey 
   2: validationKey="3E622C9B81A29248B61C4A7863F9632ED1A98574741D77954E7A3643F8FFAC84F11ED1D62B9D3A9813389FB969AEFBE95BCFFD46D50840E67A167AA987DDE2DB" 
   3: decryptionKey="5950EB5459814355C270F07761331247D83723D0701EBF21" validation="SHA1"/>

 

Nota: Los valores aceptados para decryptionKey es de 8 a 24 bytes (en el ejemplo se usan 24) y para validationKey es de 20 a 64 bytes ( en el ejemplo se usa el nivel mas alto 64 bytes)

El resultado lo incorporaremos en ambas aplicaciones de está manera el token será compartido por ambas aplicaciones, el código en ambos web.config deberia de quedar similar al siguiente:

 

   1: <connectionStrings>
   2:         <add name="MembershipCS" connectionString="Data Source=(local);Initial Catalog=kpmg;Integrated Security=true;"/>
   3:     </connectionStrings>
   4:     <system.web>        
   5:         <!--
   6:             The <authentication> section enables configuration 
   7:             of the security authentication mode used by 
   8:             ASP.NET to identify an incoming user. 
   9:         -->
  10:         <authentication mode="Forms"/>    
  11:     <membership defaultProvider="SqlProv">
  12:             <providers>
  13:                 <add name="SqlProv" type="System.Web.Security.SqlMembershipProvider,System.Web, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a" 
  14:              connectionStringName="MembershipCS" 
  15:              enablePasswordRetrieval="false" 
  16:              enablePasswordReset="true" 
  17:              requiresQuestionAndAnswer="true" applicationName="/" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1" passwordAttemptWindow="10" passwordStrengthRegularExpression=""/>
  18:             </providers>
  19:         </membership>
  20:  
  21:     <machineKey validationKey="3E622C9B81A29248B61C4A7863F9632ED1A98574741D77954E7A3
  22: 643F8FFAC84F11ED1D62B9D3A9813389FB969AEFBE95BCFFD46D50840E67A167AA987DDE2DB" 
  23:   decryptionKey="5950EB5459814355C270F07761331247D83723D0701EBF21" validation="SHA1"/>

 

De esta manera el path queda de la siguiente manera:

 

Conclusión

Asp.Net permite configurar de una manera muy rápida el compartir un token de autentificación entre diferentes aplicaciones web.

Invitaciones enviadas
20 February 08 04:43 AM | mmonterroca | with no comments

Las invitaciones para la clínica 70-536 ya fueron enviadas (perdón por el día de retraso)  en total se enviaron 551 invitaciones, por favor verifiquen la recepción del correo electrónico.

 

De nuevo, gracias por su interés

 

Saludos, Misael.

¡PodWorx!
14 February 08 05:59 PM | mmonterroca | 1 comment(s)

¡Esta es nuestra semana de lanzamientos! El día de hoy le toco a nuestro podcast aka "PodWorx", más información aqui y aqui

 

 

.danza :D

Filed under: ,
Mas recursos
13 February 08 09:05 PM | mmonterroca | with no comments

Como muy bien Rocky lo comento en su post de "como ser mejor desarrollador" una buena manera de lograrlo es viendo webcast,  MSDN Media Center es un recurso de medios en español en donde existe bastante contenido, WebCast, ScreenCast y PodCast

Y para muestra, falta un botón  mi buen amigo Haaron Gonzalez estará dando dos webcast sobre VSTO y Flujos de trabajo sobre Sharepoint, altamente mente recomendables

 

Salu2

Filed under: ,
Invitaciones a clínica en línea
13 February 08 09:20 AM | mmonterroca | 1 comment(s)

Hemos tenido una excelente respuesta para la clínica que impartiremos en línea, al momento hemos recibido más de 150 solicitudes de invitación (muchas gracias por su interés),  dicha invitación será enviada el próximo lunes 18 de febrero ya que  estamos realizando los últimos ajustes a nuestro portal. Aún cuando el curso es en línea será necesario establecer un limite, crearemos varios grupos con la finalidad de poder brindarles una mejor atención.

 

La invitación enviada los llevara a una forma de registro que les pedirá la siguiente información básica:

    • Nombre Completo
    • País (hemos recibido invitaciones de varios países)
    • Edad
    • Comunidad (en el caso de que pertenezcas a alguna)
    • Url personal (blog)
    • Nivel de conocimientos en .Net
      • 100 - Básico
      • 200 - Medio
      • 300  - Avanzado
      • 400  - Experto

 

Está información es necesaria para poder crear grupos con perfiles afines.

 

Nuevamente, gracias por su interés.

Clínica gratuita para certificación
12 February 08 07:56 PM | mmonterroca | with no comments

El próximo lunes 3 de marzo daremos inicio a una clínica online  gratuita de entrenamiento enfocada a presentar el examen de certificación 70-536, la clínica tendrá una duración aproximada de 2 meses.

 

Si quieres inscribirte u obtener más información visita la página

http://learning.devworx.com.mx/certificaciones/70-536/default.aspx

DevWorx Learning Center
12 February 08 12:42 PM | mmonterroca | with no comments

Como bien ya lo mencionó Rocky estamos estrenando nuestro DevWorx Learning Center en el cual estaremos generando contenido gratuito sobre la plataforma Microsoft.

 

Estamos comenzando a generar contenido para:

Los cursos se dividirán en varias secciones (el esqueleto ya está generado en cada uno de los sitios) pronto habilitaremos una sección de notificación de contenido vía RSS o e-mail para que puedan estar enterados cada vez que haya nuevo material. Esperamos que esta iniciativa sea de mucha utilidad para ustedes.

 

Si quieren que abordemos un tema en particular no duden en mandarnos un correo.

 

Saludos!

New transaction cannot enlist in the specified transaction coordinator.
08 February 08 10:55 PM | mmonterroca | with no comments

Escenario:

Servidor 1:

  • Windows Server 2000 SP4
  • Sql Server 2000 SP4

Servidor 2

  • Windows Server 2003 SP2
  • BizTalk Server 2006
  • SQL Server 2005 SP2

 

Servidor 2 tiene una orquestación en Biztalk la cual necesita persistir información en una base de datos localizada en el servidor 1, cuando biztalk intenta crear la transcacción dentro de SQL Server 2000 da el siguiente error: "New transaction cannot enlist in the specified transaction coordinator."

 

Utilizando la herramienta DTCTester se obtiene el siguiente resultado:

 

   1: Executed: dtctester
   2: DSN:  test
   3: User Name: sa
   4: Password: sa
   5: tablename= #dtc8346
   6: Creating Temp Table for Testing: #dtc8346
   7: Warning: No Columns in Result Set From Executing: 'create table #dtc8346 (ival int)'
   8: Initializing DTC
   9: Beginning DTC Transaction
  10: Enlisting Connection in Transaction
  11: Error:
  12: SQLSTATE=25S12,Native error=-2147168219,msg='[Microsoft][ODBC SQL Server Driver]Distributed transaction error'
  13: Error:
  14: SQLSTATE=24000,Native error=0,msg=[Microsoft][ODBC SQL Server Driver]Invalid cursor state
  15: Typical Errors in DTC Output When
  16: a.  Firewall Has Ports Closed
  17: -OR-
  18: b.  Bad WINS/DNS entries
  19: -OR-
  20: c.  Misconfigured network 
  21: -OR-
  22: d.  Misconfigured SQL Server machine that has multiple netcards.
  23: Aborting DTC Transaction
  24: Releasing DTC Interface Pointers
  25: Successfully Released pTransaction Pointer.

 

Posibles soluciones:

    1. Firewall Has Ports Closed, No existe ningún software que se encuentre bloqueando ningún puerto
    2. Bad WINS/DNS entries, EL dns se encuentra correctamente configurado, utilizando DTCPING el servidor responde correctamente
    3. Misconfigured network, Descartado, misma solución que el punto anterior
    4. Misconfigured SQL Server machine that has multiple netcards, Ambos servidores tienen dos tarjetas de red, se dejo habilitada 1 y el problema persistia.

Solución

  1. En servidor 1, localizar la entrada del registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security (si no existe, crearla)
  2. Crear una entrada del tipo DWORD con el nombre NetworkDtcAccessTip con el valor 1, (Cero deshabilita el acceso vía TIP) Mas información
  3. En el servidor 2, habilitar entrar a  Component Services -> Computers -> My Computer -> Boton Derecho Properties  Ir a MSDTC Tab - > Habilitar Enable Transaction Internet Protocol (TIP) Transactions
  4. En ambos servidores  reiniciar MSDTC  net stop msdtc , net start msdtc
  5. Probar nuevamente :D

Si obtienen un resultado similar a la siguiente imagen, es que todo está funcionando perfectamente

ScreenCast : WCF Exponiendo un servicio
06 February 08 01:12 PM | mmonterroca | 2 comment(s)

Este screencast es la continuación de WCF Introducción

 

En este screencast veremos como exponer un WCF Service Library, los temas que son tratados son:

  • EndPoint
  • Bindings
  • Host
  • Medatada

Url WMV para descarga (mejor definición)
Url Flash para ver Online

Filed under: , , ,
ScreenCast : WCF Introducción
05 February 08 01:30 PM | mmonterroca | 2 comment(s)

Hola!

 

Les dejo este primer screencast de Windows Communication Foundation en donde veremos como crear un WCF Service Library los temas que son tratados:

  • ServiceContract
  • OperationContract
  • DataContract
  • DataMember

 

 

Url WMV para descarga (mejor definición)
Url Flash para ver Online

Windows Server 2008 RTM
05 February 08 03:13 AM | mmonterroca | 1 comment(s)

Una imagen dice mas que mil palabras...

 

WinServer 2008 RTM

ScreenCast : Intro AJAX ControlToolkit en VS2008
31 January 08 07:21 AM | mmonterroca | 2 comment(s)
Les dejo este screencast nivel 100 en donde veremos cómo Instalar, Configurar  y utilizar AJAX ControlToolkit dentro de Visual Studio .NET 2008
 
 
 
 
Nota: Tuve un problema ligero problema con el audio y en ocasiones se escuchan unos picos de ruido, por eso es mejor reproducirlo a un nivel de audio moderado.
More Posts Next page »