Configuración de IIS: Autenticación windows para ciertas páginas

Uno de los temas más peliagudos para un desarrollador es la configuración del servidor y desgraciadamente, muchas veces no hay más remedio que hacerlo ya que seremos nosotros los que echemos una mano a los compañeros de sistemas.

En este post, mostraremos como configurar el IIS para que ciertas páginas requieran la autenticación windows mientras que otras sigan con el acceso anonimo

Aqui os dejo un pequeñe manual a todo color de como realizar esta sencilla configuración

1- Selecciona la página que tiene que tener el acceso restringido, pon la vista de caracteriticas
imagen de configuracion de IIS

2- Elige la autenticación. Ahí elige la de Windows, asi solo se puede acceder aquellos usuarios que estén en la máquina o en el activeDirectory del servidor
imagen de configuracion de IIS

Anuncios

Consulta de un buzón de correo (pop)

Hace un tiempo hablamos sobre la posibilidad de saber si un correo ha sido abierto por parte del destinatario, sin la necesidad de emitir un acuse de recibo. Este post lo titulamos Comprobación de apertura del correo.

Como en aquel post escribimos, para tener un control total sobre los correos enviados y recibidos, es necesario poder consultar nuestro buzón de correo desde el que mandamos los correos corporativos.

Con la técnica anterior, podemos saber si la dirección está bien formada, o si el usuario ha abierto el correo e incluso a veces si la dirección existe o no. Pero aun así, hay veces que esto no lo podremos saber, y hay que esperar a que nuestro servidor nos envíe un correo en el que nos informe del resultado del envío. Estos correos son los famosos Delivery Failure que aparece en el asunto del mismo.

En este post hablaremos de una API () y como esta nos ayuda a realizar las consultas y cómo manejar los datos obtenidos del  servidor pop. Esta API la podéis descargar de aquí, y se llama smtpop.

Una vez incluida esta librería al proyecto podemos crearnos un una clase que la consuma y realice las consultas, yo recomiendo un método estático que evite tener que instanciar la clase. El código seria el siguiente

public static bool ConsultaPop()

{

POP3Client pop = new POP3Client();

try

{

pop.ReceiveTimeout = 3 * 60000; // Set the timeout to 3 minutes

pop.Open(ConfigurationManager.AppSettings[“pop”].ToString(),                Convert.ToInt32(ConfigurationManager.AppSettings[“puertoPop”].ToString()), ConfigurationManager.AppSettings[“usuarioMail”].ToString(), ConfigurationManager.AppSettings[“ClaveCuentaPop”].ToString());

 

// retrieve messages list from pop server

POPMessageId[] messages = pop.GetMailList();

messages.OrderBy(x => x.Id);

 

foreach (POPMessageId id in messages)

{

POPReader reader = pop.GetMailReader(id);

MimeMessage msg = new MimeMessage();

// read the message

msg.Read(reader);

try

{

//Buscamos aquellos que han fallado en el envío

if (msg.Subject.Contains(“Delivery Failure”))

{

foreach (MimeAttachment attach in msg.Attachments)

{

string  expresion = “\\w+([-+.’]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*”;

if (Regex.IsMatch(attach.Body, expresion))

{

//busqueda del fallo

//Buscamos el correo que falla

string cadenaSeparadora =attach.Body.Remove(0, attach.Body.IndexOf(“To:”));

//Solo me vale la primera, ya que solo mando un mail, por correo (persona)

string[] mail = cadenaSeparadora.Remove(0, 3).Split(‘\r’);

string subj = (from s in mail

where s.Contains(“Subject:”)

select s).First();

string subjectCasiAsilado = subj.Remove(0,subj.IndexOf(“Subject:”)).Replace(“Subject:”,string.Empty).Trim();

GestionContactoBll.ActualizarIncidenciaContacto(mail[0].ToString(), subjectCasiAsilado, Entidades.TiposErrorMailing.NO_EXISTE_MAIL, “Error enviado por su gestor de correo, este correo no existe”);

 

return true;

 

 

}

}

}

}

catch

{

}

}

}

catch (Exception err)

{

}

pop.Quit();

return false;

}

 

Hay que tener en cuenta que hay parámetros de configuración que los estamos cogiendo del web.config (appSetting). Que el cuerpo del mensaje se envía como archivos adjuntos por eso tenemos que ir leyendo estos archivos para sacar la información que deseamos.

 

Conclusión:

El proceso de gestión de campañas de e-mailing, son procesos claves para el funcionamiento de muchas empresas, por ser un método de publicidad gratuita o al menos barata. Por ello hay que tener un control exhaustivo de aquellas direcciones que existentes y de los temas de interés del usuario.

A veces no vale con técnicas de apertura del correo electrónico (como son las técnicas de pixel mágico comentadas en el post sobre la comprobación de apertura del correo. ) Sino que a veces hay que ir más allá y hay que realizar consultas a un buzón o servidor pop con la librería smtpop, podemos hacer estas consultas de manera sencilla, pero conociendo como los servidores notifican el fallo del envío (subject y ficheros adjuntos).

 

Un saludo a todos

Error de IIS 503.19

Etiquetas

, ,

Este post aunque sea corto, creo que será de gran ayuda para todos aquellos, que van a desplegar sus aplicaciones web, en un servidor IIS nuevo o recién instalado.

No es que sea un gran problema, pero es muy común, porque normalmente se tiende a ir a “tiro hecho”, e instalamos primero el FrameWork, y luego nos damos cuenta de que no está instalado el IIS.  En este punto procedemos a instalarle, y cuando terminamos desplegamos la aplicación en él, aso que cuando la ejecutamos, nos salta este famoso error.

Bien, si ya te ha saltado lo mejor es ejecutar este comando siguiendo estos pasos y con esto se arreglará el error:

En ejecutar: cmd

En la ventana haremos un cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319

Y ejecutamos aspnet_regiis –i

Como veis la solución es sencilla, con esto instalamos, o lo que es lo mismo registramos el FrameWork en el IIS.

Lo mejor para que no ocurra esto es seguir estos pasos para desplegar la aplicación

1-      Verificar que esta el IIS

2-      Si no está, instalar el IIS

3-      Instalar el FrameWork

4-      Desplegar la aplicación

Y con esto no evitaremos el error 503.19

 

Un saludo a todos

Comprobación de apertura del correo

Cuando se va a hacer una campaña de e-Mailing a veces es útil  conseguir estadísticas, saber si un correo existe, y si el tema que se le ha enviado le interesa o no.

Estas técnicas en manos maliciosas, pueden dar lugar a un spam más agresivo, pero eso sí, más efectivo.

 

Si presuponemos, que la gente abre solo aquellos correos que le resultan interesantes, entonces podemos llevar un control de correos existentes, campañas desarrolladas y clientes a los que les interesa un tema.

 

Ya que las técnicas de existencia de dirección de correo se basan en la práctica de envío y captura de error, o la consulta al servidor pop, para comprobar que correos han sido devueltos (este tema lo trataremos en un nuevo post). Hoy mostraremos como insertar un código en un correo y este que nos informe de si el correo ha sido abierto:

 

Como siempre nos centraremos en .NET para mostrar cómo hacerlo.

Lo primero es generarnos una clase en .net que envíe un correo electrónico, en mi caso sería  el método de envío es el siguiente:

/// <summary>

/// Envía un correo electrónico creado a partir de los datos pasados como parámetro

/// </summary>

/// <param name=”smptServer”>servidor smtp</param>

/// <param name=”usuarioCorreo”>Usuario con permisos para enviar el correo</param>

/// <param name=”passCorreo”>Password del usuario con permisos para enviar el correo</param>

/// <param name=”from”>Sender</param>

/// <param name=”to”>Destinatario</param>

/// <param name=”subject”>Asunto</param>

/// <param name=”body”>Cuerpo</param>

/// <param name=”isHtml”>True si es un mensaje con formato, false en caso contrario</param>

public static void EnviarEmail(string from, List<string> to, string subject, string body, bool isHtml,List<string> ListaAdjunto)

{

//Configuración del mensaje

#region mensaje

//Creamos el mensaje

MailMessage correo = new MailMessage();

 

//Quien lo envia

correo.From = new System.Net.Mail.MailAddress(from);

 

//destinatarios

foreach (string para in to)

{

correo.To.Add(para);

}

//Asunto

correo.Subject = subject;

//Cuerpo

correo.Body = body;

//¿Es un mensaje con formato?

correo.IsBodyHtml = isHtml;

//Prioridad en el envio

correo.Priority = System.Net.Mail.MailPriority.Normal;

 

#endregion

 

#region ArchivosAdjuntos

foreach (string adjunto in ListaAdjunto)

{

UTF8Encoding myEncoder = new UTF8Encoding();

byte[] bytes = myEncoder.GetBytes(adjunto.ToCharArray());

MemoryStream ms = new MemoryStream(bytes);

 

System.Net.Mime.ContentType cont = new System.Net.Mime.ContentType(“application/vnd.ms-excel”);

Attachment att = new Attachment(ms, “pedido.xls”, MediaTypeNames.Application.Octet);

 

correo.Attachments.Add(att);

}

#endregion

//Configuración servidor de correo.

 

#region envio

//definimos protocolo

System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();

smtp.EnableSsl = (ConfigurationManager.AppSettings[“sslCorreo”].ToString()==”1″ ? true: false);

//indicamos el servidor smtp

smtp.Host =ConfigurationManager.AppSettings[“smtp”] ;

//le damos las credenciales para poder usar el servidor

smtp.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings[“usuarioMail”] , ConfigurationManager.AppSettings[“claveMail”] );

//enviamos

smtp.Send(correo);

 

#endregion

}

A este método se le pasa un texto formateado con HTML, y se le dice que el correo es HTML.

Al texto HTML que le pasamos le añadiremos una imagen con el atributo src que apunte a una dirección de una web con parámetros por la URL (get) esto nos permite recibirlos cuando el cliente abra el archivo.

mensaje.AppendLine(“<html>”);

mensaje.AppendLine(“<head>”);

mensaje.AppendLine(“<title>Gestion Editorial</title>”);

mensaje.AppendLine(“</head>”);

mensaje.AppendLine(“<body>”);

 

mensaje.AppendLine(this.Editor1.Content.ToString());

mensaje.AppendFormat(“<img src='{0}?user={1}’  style=’visibility:hidden; width:0.5px; height:0.5px;’  />”, ConfigurationManager.AppSettings[“Respuesta”].ToString(), item.Email_1);

mensaje.AppendLine(“</body>”);

 

mensaje.AppendLine(“</html>”);

mensaje.AppendLine(“”);

 

Esto es así, por la forma de funcionar del protocolo http, y del HTML. El protocolo http, es un protocolo desconectado, que inicia la descarga, y se desconecta cuando termina. La etiqueta img, abre una nueva conexión y se trae el archivo al que referencia. Si este archivo es una web, ejecutara  el código de la misma. Si a esta imagen le ponemos que sea oculta y además de tamaño ínfimo… pues obtenemos que la imagen solicita la página de destino, ejecutamos el load, donde recuperamos los parámetros y actualizamos nuestra base de datos. Así sabemos que el cliente abrió el correo, pero sin que el usuario se haya dado cuenta de lo que ha ocurrido, y sin depender de que acepte el envío de confirmación.

 

protected void Page_Load(object sender, EventArgs e)

{

string mail = Request.QueryString.Get(“user”).ToString();

 

GestionContactoBll.ActualizarIncidenciaContacto(mail, Entidades.TiposErrorMailing.ABIERTO_OK, “El usuario ha abierto el correo”);

}

Como veis es sencillo y no requiere de mucho esfuerzo, pero nos puede aportar un gran valor añadido a nuestras campañas de e-Mailing.

Detección de JavaScript con Ajax.net

Abstract: En este articulo mostramos como podemos detectar si el cliente esta ejecutando Javascript lo que nos ayuda a hacer webs accesibles y funcionales.

Todos los que nos hemos tenido que enfrentar al problema de la accesibilidad, nos hemos encontrado con la disyuntiva de la usabilidad frente a la accesibilidad. ¿Hacer páginas web accesibles está reñido con la usabilidad? ¿Qué puedo hacer para no dejar de usar Javascript  y sin embargo la web sea accesible?

La realidad a la hora de hacer un desarrollo web , nos lleva a ver que hacer un site accesible no es complicado siempre que se sigan unas normas estrictas de diseño e implementación. Pero cuando  además se la quiere  dotar  de una buena experiencia de usuario la cosa cambia.

Hasta ahora hemos visto equipos de desarrollo que realizan dos portales , uno accesible y otro no accesible, de tal manera que según se activa o desactiva el Javascript la web va redirigiendo a una versión u a otra. Para nosotros esta solución tiene una gran desventaja,  ya que esto conlleva el mantenimiento de dos portales en paralelo,  lo que  puede crear incongruencias.  Aunque tiene la ventaja de que la página funcional es plenamente funcional  y  es plenamente accesible.

La otra solución es la de poner etiquetas noscript y dotar de esa funcionalidad a la web…

La solución que hoy proponemos trata de unir las etiquetas noscript con una nueva técnica que combina el Ajax y métodos de página, para poder detectar si está o no activo el Javascript

En lo primero que podemos pensar  es en  utilizar el objeto Request.Browser.JavaScript, sin embargo, esto trae problemas ya que solo dice si el navegador lo admite , pero no nos dice si está activo  (además está en desuso y dará un bonito Warning).

El código (en c#) de la solución propuesta es el siguiente:

public static bool JavascriptActivo { get; set; }

#region Eventos del formulario

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostback)

{

JavascriptActivo = false;

}

}

#endregion

 

[WebMethod]

public static void TieneJavascript()

{

JavascriptActivo = true;

}

Y en el aspx:

<asp:ScriptManager ID=”ScriptManager1″ runat=”server” EnablePageMethods=”True”>

</asp:ScriptManager>

 

<script language=”javascript” type=”text/javascript”>

 

PageMethods.TieneJavascript();

</script>

 

Con esto le estamos diciendo que queremos utilizar el método de página “TieneJavaScript”, el cual activa la propiedad estática  que define si utiliza Javascript. Y por último, en cada postback le decimos que la ponga  a false (que no utiliza Javascript). En realidad, el poner esta propiedad a false es para detectar si mantiene activo el Javascript.

La explicación es sencilla, según el ciclo de vida primero se ejecuta el  onload, y luego se renderiza la página, es entonces cuando se ejecuta el Javascript, que está funcionando por Ajax, y por lo tanto no realiza refresco de la página.

Si utiliza Javascript se hace la llamada al método de página y todo transcurre como se espera, si no, simplemente se actualiza la variable y se muestra la página sin javascript.

Conclusión:

El 28 de diciembre del 2007 se publicó la Ley  de Medidas de Impulso de la Sociedad de la Información. En la misma se obliga a los entes públicos a la eliminación de barreras de accesibilidad de sus sitios. Esta es la razón principal por la que todo desarrollador, debe aprender las reglas para realizar sus desarrollos web de forma accesible. Entre estas normas destacamos la imposibilidad de ejecución de javascript, o mejor dicho la opción de hacer lo mismo pero a traves del servidor.

Hasta ahora las medidas que se han tomado, pasaban por la duplicidad de codigo, redirigiendo a páginas accesibles y dejando el portal no accesible a disposición de usuarios sin limitaciones.

En nuestra solución damos un remedio a la situacion anterior, ya que al ejecutar el script a descargase la página detectamos en las primeras fases si se esta ejecutando o no, y en sucesivos postback. Estaremos seguro de cual es la situación actual de navegador.

Si a eso le sumamos que por defecto el estado del javascript del navegador cliente será estable nos da un maravilloso juego de probar una vez (en la página de inicio) y guardar dicho estado en la session de usuario.

Todo esto nos lleva a una amplia gama de posibilidades, pero siempre con la ventaja de no tener que duplicar el código

Configuración de IIS7 e IIS7.5 para el uso de DNI-e

No es ningún secreto que la administración pública está intentando, cada vez más, lanzar la utilización del DNI electrónico (a partir de ahora DNI-e). No obstante aunque su uso todavía no es muy elevado, las ventajas que nos proporciona si son abundantes, como es el poder realizar gestiones con la administración pública o incluso con entidades bancarias, de manera segura.

En este post nos centraremos en cosas técnicas, y más en concreto en como configurar un IIS 7.0 o 7.5 para  que sea capaz de requerir y admitir los certificados del DNI-e.

Para comenzar, debemos comentar la gran problemática que tiene IIS para la validación del certificado, más en concreto  el estado de la revocación del certificado cliente, este es el quid de la cuestión, ya que la configuración de IIS para pedir certificados es sencillo, pero hacer que admita un DNI-e es más complicado ya que conlleva más operaciones a realizar. El cómo configurar esto se verá como el último paso dentro de este proceso.

1º- El primer paso será la instalación del certificado del servidor, en esta demo crearemos un certificado propio del servidor, este no será reconocido como válido ya que la ruta de certificación no es válida al ser autoafirmado. Este certificado tendrá que ser validado por el cliente como un certificado de confianza.

https://i1.wp.com/marferdotnet.blogspot.es/img/1.png

Como muestra la ilustración, en la vista de características del servidor, elegimos la opción de certificados del servidor, esto nos lleva a una pantalla que está vacía y en el menú de la derecha elegiremos la opción de “Crear certificado autofirmado”.

2-º A continuación crearemos el sitio web, que requerirá el certificado. Para ello  utilizamos el botón derecho sobre la carpeta de sitios y aparece una ventana como muestra la imagen siguiente, y en ella la rellenaremos como se muestra en dicha imagen, es aconsejable pulsar el “conectar como” y  configurarlo con un usuario de la máquina que tenga permisos sobre la carpeta en la que se configura la aplicación web.

https://i0.wp.com/marferdotnet.blogspot.es/img/2.png

También es posible crearlo sin más en el puerto que no sea de SSL y luego hacer que sean determinados archivos que lo requieran añadiendo un enlace SSL al sitio web.

3-º Una vez realizado este paso configuramos que el sitio requiera el SSL, a través de la vista de características de la página que queremos que la requiera. En esta nueva ventana marcaremos las opciones de requerir SSL y requerir certificado del cliente, con esto aseguramos la identificación mutua entre el navegador cliente y el servidor.

4-º Ahora pasaremos a configurar el acceso, para eso en la opción de autenticación deshabilitamos todas excepto el acceso anónimo y modificamos este acceso para que sea con el usuario que tenía permisos sobre esta carpeta

https://i1.wp.com/marferdotnet.blogspot.es/img/3.png

Hasta aquí son los pasos lógicos de una aplicación web. Pero ahora viene la parte más complicada que es la que puede demorar la configuración para todos aquellos que lo hacen por primera vez.

5-º En la vista de características del sitio tenemos la opción de Editor de configuración, es un asistente que nos facilitará mucho el siguiente trabajo.

https://i1.wp.com/marferdotnet.blogspot.es/img/4.png

6-ºA continuación se accede al menú ManyToOneMappings, en el que se tienen que definir las asociaciones entre certificados y cuenta de usuario. Se deben configurar los parámetros con los siguientes valores:

  • description: dnie.
  • enabled: True.
  • name: dnie. (usuario de la máquina)
  • pasword: contraseña usuario de la maquina especificado en el campo anterior.
  • permissionMode: Allow.
  • userName: dnie. (usuario de la máquina)

https://i1.wp.com/marferdotnet.blogspot.es/img/5.png

7-ºPor último se crea una regla para definir qué certificados se aceptarán. En este caso, se aceptan los certificados de autenticación del DNI-e, para ello se tendrán que configurar los parámetros con los siguientes valores:

  • certificateField: Issuer.
  • certificateSubField: OU.
  • compareCaseSensitive: True.
  • matchCriteria: DNIE

https://i2.wp.com/marferdotnet.blogspot.es/img/6.png

8-º Ahora nos toca instalar los certificados root y CA del DNI-e, en los almacenes de confianza (tanto el raíz de confianza, como la subordinada)

Ahora tenemos deshabilitar la validación de la revocación del certificado, para eso seguimos los siguientes pasos

9-º en ejecutar hacemos cmd y en la consola escribimos

netsh> http netsh http> show sslcert

Esto nos mostrará los certificados instalados en el servido. Copiaremos el certificado del sitio para el que estamos configurando la autenticación DNIe a un block de notas, puesto que posteriormente necesitaremos los datos de hash y appid.

10-º Eliminamos el certificado: netsh http> delete sslcert ipport=0.0.0.0:443

11-º Lo agregamos nuevamente pero deshabilitando la opción de verificación de revocación de certificado cliente:

netsh http>add sslcert ipport=0.0.0.0:443 certhash=3c7a212548dbf8941a3709b4a7bc3db4fe7297ba appid={4dc3e181-e14b-4247-b022-59fc669b0914} certstorename=MY verifyclientcertrevocation=disable

y con esto estará listo para funcionar.

Importancia de la innovacion y Silverlight

Muchas veces, la gran diferencia entre el éxito y el fracaso de una aplicación, es la experiencia de usuario. Ya no es válido pensar que la funcionalidad dará la satisfacción al cliente. Actualmente esta premisa, sin dejar de ser necesaria, no es ni mucho menos la única que garantiza la satisfacción de los usuarios finales. Ahora nos piden que la aplicación sea fácil de usar, que sea vistosa… en una frase: Que nos aporte una rica  experiencia de usuario

Cuando hablamos de aplicaciones web, todavía hay mucha gente que piensa en aplicaciones menos ricas que las de escritorio, y con una experiencia de usuario estática. Esta idea es la que debemos de desechar, ya que el crear aplicaciones estáticas, y poco vistosas, únicamente pensadas en la funcionalidad, está ya en desuso, y poco a poco nos echa del mercado.

No se debe despreciar el diseño, simplemente porque el usuario final sea poco avanzado o formado en el uso de las nuevas tecnologías, más bien, en este caso debe ser todo lo contrario y dotar al usuario de más herramientas que faciliten su trabajo y formarle en el uso de la nueva aplicación. 

En nuestro mundo el lema debe ser “Innovate Don´t Imitate”, muy a pesar de muchos que piensan que en la costumbre está el éxito, ya que si ofreces lo mismo ¿para qué cambiar?

Para ello en .net disponemos de una potente herramienta, Silverlight, esta tecnología nos permite generar aplicaciones Ricas, que se ejecutan en el cliente, y le da una experiencia de usuario mucho más potente a nuestras aplicaciones. No se trata solo de que los botones tengan aspectos distintos, sino del  echo de dotar de animaciones, controles multimedia en incluso de un diseño gráfico vectorial a nuestras aplicaciones web.

Además hay que contar con la ventaja que todo eso se realiza con una programación en los lenguajes que utilizamos para el resto de aplicaciones (VB o C#).

Otra ventaja son las herramientas que tenemos para poder desarrollarlas, como son las herramientas Expression (en concreto Expression Blend) y de Visual  Studio.

Yo ya he creado mis controles y aplicaciones, si no habéis empezado os recomiendo que os vayáis poniendo al día, es fácil, sencillo y para toda la familia!

Búsqueda de un usuario en LDAP

Hace tiempo escribí un post de acceso a un LDAP, y es que a veces es necesario acceder a la información que guardamos en él.  Unas veces queremos consultar algún dato y otras utilizarlo para autenticación y autorización en el uso de alguno de las aplicaciones que vamos desarrollando para que sean usadas en un ámbito corporativo ( o simplemente en un dominio)

En este caso voy a describir como sería el proceso de recuperación de un correo electrónico, ya que es uno de los datos que por regla general siempre están presentes en los LDAP.

En este ejemplo disponemos del nombre de usuario, lo cual nos facilita el acceso al directorio, ya que no tendremos que recorrerlo sino que ejecutaremos una consulta sobre este usuario. El código seria este:

 

//Primero acotamos los varoles de busqueda y la ruta del Active Directoy,

string[] domainAndUsername =usuario.Persona.AccountName.Split(‘\\’);
string strDomain =domainAndUsername[0].ToString();
string username = domainAndUsername[1].Trim();

//Creamos una entra al Active Directory que devolverá el árbol en la variable entry.
DirectoryEntry entry = new DirectoryEntry(UrlLdap,UsuarioLDAP,PaswordLDAP);

//Realizamos una busqueda sobre la entrada anteriormente seleccionada.
DirectorySearcher search = new DirectorySearcher(entry);

//Filtramos el usuario del que queremos obtener los datos.
search.Filter = “samaccountname=” + username;

//Y realizamos una busqueda de todos sus datos.
SearchResult results = search.FindOne();

ResultPropertyCollection colProperties = results.Properties;

//Obtenemos la propiedad mail
string mail = string.Empty;
foreach (object value in colProperties[“mail”])
{
mail = value.ToString();
}

return mail;

 

Espero que os sea de utilidad

 

Un saludo a todos

Lectura y escritura asíncrona de peticiones y respuestas http

Hace ya un tiempo que venimos investigando sobre la futura versión de asp.net, y no nos deja de asombrar. En este caso hoy hablamos de un paso más en el procesamiento asíncrono de una web, que es lo que dota a una web de un funcionamiento sin molestos postbacks.

En la versión 4, se incluyó la lectura y escritura de las peticiones http a través de streaming.  Esto es posible gracias al método HttpRequest.GetBufferlessInputStream, el problema de este método es que solo se puede ejecutar de forma síncrona  en un hilo, el cual tiene la duración de la petición (dura lo que dura la petición).

En la versión 4.5 la cosa evoluciona pudiendo además ejecutarse de forma asíncrona. Con lo que en punto tenemos un mayor control, y nos dota de una herramienta más para proporcionar una mejor experiencia de usuario.

Además en esta versión se ha añadido la posibilidad de usar un doble buffer de lectura de peticiones http, que proporcionan una mayor integración con los manejadores http del flujo de descarga y esto va tanto en aspx como en los controladores MVC.

ya iremos hablando más del tema

Un saludo a todos

Controles fuertemente tipados en asp.net 4.5

El problema de la seguridad en internet, siempre ha sido un tema prioritario para los desarrolladores, por eso, los grandes esfuerzos de las compañías en sacar frameworks cada vez más potentes y seguros. Hoy nos orientamos a mostrar uno de esos esfuerzos que vendrá incorporado en la nueva versión de ASP.NET 4.5

Todavía es una preview, pero la próxima versión de asp.net, ya está despertando un gran interés en el mundo del desarrollo web. No solo se da más impulso a la parte estándar del html5, sino que además incorpora modificaciones que hacen aún más potente esta gran herramienta de desarrollo web.

Hoy queremos hacernos eco de una novedad, que a nuestro modo de ver es un gran avance,  y que tendrá una gran repercusión tanto en la seguridad, como en los tiempos de respuesta de nuestras aplicaciones. Nos  referimos la posibilidad de tipar fuertemente los controles enlazados a datos. Y para ello veremos un ejemplo con el control que más flexibilidad nos proporciona, pero a la vez que más complejidad requiere: El repeater.

El repreater es un control, que nos permite repetir una especie de plantilla con cada elemento enlazado dentro del datasouce. Esta característica, que es de gran utilidad, hacía uso de un enlazado de datos dinámico, lo que daba una gran flexibilidad a este control, pero a la misma vez podía aumentar el riesgo de crear vulnerabilidades por XSS (Cross-Site Scripting).

Si ya es verdad que se dieron pasos para solucionar este problema en asp.net 4.0, ahora con el tipado fuerte de datos se ha conseguido un gran avance (ya que no nos gusta decir en material de seguridad que algo es definitivo)

En estas líneas podemos observar cómo se hace el linkado de datos al campo text a través de las instrucciones <%#Eval(‘xxx’)%>. Este código es potencialmente peligroso, ya que es vulnerable a XSS.

<asp:Repeater  ID=”rptEjemplo1” runat=”server” >

<ItemTemplate>

<asp:Label runat=”server” ID=”lblComentario” Text=’<%# Eval(“Comments”) %>’/>

<asp:Label runat=”server” ID=”lblNombre” Text=’<%# Eval(“Name”) %>’/>

<asp:Label runat=”server” ID=”lblEmail” Text=’<%# Eval(“Email”) %>’/>

</ItemTemplate>

</asp:Repeater>

 

Ahora tendremos esto mismo, pero lo haremos estableciendo una nueva propiedad (ModelType) y cambiando las etiquetas peligrosas por estas otras

<%#Item.Clientes.Email%>

En el que al estar tipado el control no admitirá valores que no estén contemplados en la clase que se establece como tipo del control.

Así el ejemplo anterior nos quedará de esta forma:

<asp:Repeater  ID=”rptEjemplo1” runat=”server” ModelType=”Clientes”  >

<ItemTemplate>

<asp:Label runat=”server” ID=”lblComentario” Text=’<%#Item.Clientes.Comments %>’/>

<asp:Label runat=”server” ID=”lblNombre” Text=’ <%#Item.Clientes.Name %>’/>

<asp:Label runat=”server” ID=”lblEmail” Text=’ <%#Item.Clientes.Email %>’/>

</ItemTemplate>

</asp:Repeater>

La gran flexibilidad que nos da el repeater, se ve a veces contrarrestado por la seguridad, por ello es de necesidad, que los desarrolladores conozcamos tanto los puntos fuertes como los débiles de los controles que usamos. En este punto los esfuerzos de la compañía de Redmond han sido constantes, tanto en la versión 4, donde se realizaron grandes esfuerzos como en la versión 4.5 con el tipado fuerte de datos en controles. Desde aquí animar a que se vayan probando y conociendo las nuevas características que nos traerá el nuevo asp.net 4.5

un saludo a todos