viernes, 7 de diciembre de 2018

Metodologias agiles

En resumen, debiera tenerse:

  • Propósito claro
  • Equipos multi-funcionales con participación horizontal de inicio a fin
  •  Líderes facilitadores (no controladores)
  • Cultura de entusiasmo y confianza
  • Involucrar al usuario (nuestra experiencia no la sustituye)
  • Iterar, versionar para rápido lanzamiento, experimentar para aprender
Que tengan un gran día ;)

jueves, 6 de febrero de 2014

Centros de aprendizaje online gratuito

Solo para comentarles que en estos tiempos está de auge la aparición  de centros de aprendizaje en línea, tal como www.udemy.com o como www.coursera.org, los cuales proporcionan cursos en múltiples categorías, pasando por temas de Administración, Psicología, Ingeniería, etc. Bueno, es cosa que se metan a revisar y seleccionar los temas que les interesen.

El motivo de este post es comentarles que también hay material para hacer desarrollo web, como javascript, html5, css3, json, asp.net, etc.

Y hay mucho material gratuito, no todo claro.

Pero aprovechen, ingresen al sitio y naveguen, conozcan todo lo que hay y a manera de chequear la calidad de los cursos, tomen los cursos gratuitos… a mi me han parecido muy buenos los videos que contiene cada curso y la calidad del material… casi me estoy volviendo adicto.

Como despedida les dejo un diploma que me gané por completar un cursito de javascript bastante básico en www.udemy.com, pero muy bien explicado. Así que se los recomiendo.

certificate-js

Microsoft también tiene recursos gratuitos acerca de su propio software, pueden aprender a usarlo entrenándose gratuitamente en http://www.microsoftvirtualacademy.com/

Espero que les sea de utilidad Guiño

lunes, 30 de diciembre de 2013

ASP.NET - Web Services y Autenticacion mediante cabeceras SOAP

soapUna forma muy conveniente de autenticar a los usuarios que consumen un web service es usando cabeceras SOAP.

La ventaja que me brinda está modalidad es que no mezcla los parámetros que requiere el web service con los datos de autenticación del usuario que consume el web service.

No vayan a pensar que esto es algo nuevo, para nada, en realidad este es un tema bastante conocido, sin embargo hago el post porque necesité enviar un ejemplo de cómo operan las cabeceras SOAP, y es el pretexto perfecto para hacer un nuevo post para este blog que lo tengo tan olvidado.

Vamos con el ejemplo, para este caso he creado una solución con dos proyectos, el primero contiene un web service con dos métodos, uno no requiere autenticación y el otro sí.

El segundo proyecto contiene una página aspx que hace de cliente y consume al web service, para lo cual debe pasar el usuario, contraseña y ambiente que solicita la cabecera SOAP que implementé.

Cabe destacar que las cabeceras SOAP permiten crear la cantidad de elementos que Ud. considere necesario, es decir es una autenticación personalizada.

Vamos a continuar explicando conforme revisemos el código.

Empecemos revisando el primer proyecto, el cual contiene varias clases que trabajan con las cabeceras SOAP.

También en este proyecto está el web service. Un punto resaltante es que cada método que requiere autenticación debe ser decorado con los atributos SoapHeader y la clase personalizada que hay creado, en este caso cAuthenticationExtension:
    <cAuthenticationExtension()> <SoapHeader("Credentials")> <WebMethod()> _
    Public Function HelloWorld_YESHeaders(ByVal FullName As String) As String
        
        Return String.Format("Hello {0}", FullName)

    End Function

Si tengo métodos en el web service que no requieren autenticación, serán decorados sólo con WebMethod:
    <WebMethod()> _
    Public Function HelloWorld_NOHeaders(ByVal FullName As String) As String
        
        Return String.Format("Hello {0}", FullName)

    End Function

Luego, en el segundo proyecto, he añadido una página aspx, el cual consume los métodos del web service:

Obviamente, primero debo añadir una referencia a dicho web service, yo la he llamado Cabec_Soap_Referencia. Luego el código para consumir los métodos del web service sería:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If IsPostBack Then Return

        'instanciamos el web service
        Dim wsx As New ws.WebService1

        'consumimos el método del web service que no requiere cabeceras SOAP
        Dim msg0 As String = wsx.HelloWorld_NOHeaders("Segundo Serrano")
        Response.Write("<br /><br />" & msg0)

        'Instanciamos la cabecera SOAP
        Dim myHeader As New ws.cAuthenticationHeader
        myHeader.UserName = "usuario1"
        myHeader.Password = "password1"
        myHeader.Ambiente = "TIENDAS EFE"

        'este método sí requiere cabeceras SOAP... si no pusiéramos esta línea, el método arrojaría error
        wsx.cAuthenticationHeaderValue = myHeader
        Dim msg1 As String = wsx.HelloWorld_YESHeaders("Segundo Serrano")
        Response.Write("<br /><br />" & msg1)

    End Sub
Les dejo el ejemplo completo.

Espero que les sea de utilidad Guiño

martes, 15 de enero de 2013

Algoritmos - Obtener capicuas de un rango de numeros con VB.NET

Bueno, siempre hay formas de llegar a un resultado, en la web hay múltiples algoritmos de programación para determinar si un número es capicúa.
En esta ocasión les dejo un algoritmo simple para obtener todos los números capicuas dentro de un rango de números determinado.
    Sub Main()

        'capicua
        Dim Start As Integer = 999
        Dim Limit As Integer = 10000
        For i As Integer = Start To Limit
            Dim s As String = i
            Dim IsCorrect As Boolean = True
            For j As Integer = 0 To (s.Length / 2) - 1
                If s(j) <> s((s.Length - 1) - j) Then
                    IsCorrect = False
                    Exit For
                End If
            Next
            If IsCorrect Then Console.WriteLine(s)

        Next
        Console.ReadKey()

    End Sub

Espero que les sea de utilidad Guiño

jueves, 11 de octubre de 2012

SQL SERVER – Completo script con las zonas horarias

time-zonesPor si alguien lo necesita, publico el script que me permite crear una tabla en la base de datos y luego insertar todas las zonas horarias.

CREATE TABLE [dbo].[cmon_timezone](
[timezoneid] [int] IDENTITY(1,1) NOT NULL,
[title] [varchar](500) NOT NULL,
[OffSet] [decimal](4, 2) NOT NULL,
CONSTRAINT [PK_cmon_timezone] PRIMARY KEY CLUSTERED
(
[timezoneid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ahora el script para insertar las zonas horarias:
SET IDENTITY_INSERT [dbo].[cmon_timezone] ON
INSERT
[dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (1, N'Islas Marshall (Hora de cambio de fecha, GMT-12:00)', CAST(-12.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (2, N'Estado Independiente de Samoa (Hora de Samoa, GMT-11:00)', CAST(-11.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (3, N'Honolulu (Hora de Hawái, GMT-10:00)', CAST(-10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (4, N'Anchorage (Horario de verano de Alaska, GMT-08:00)', CAST(-8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (5, N'Arizona (Hora de la montaña de Estados Unidos, GMT-07:00)', CAST(-7.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (6, N'San Francisco (Horario de verano del Pacífico, GMT-07:00)', CAST(-7.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (7, N'Tijuana (Horario de verano de la costa del Pacífico de México, GMT-07:00)', CAST(-7.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (8, N'Chihuahua (Horario de verano de la Montaña de México, GMT-06:00)', CAST(-6.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (9, N'Denver (Horario de verano de la montaña, GMT-06:00)', CAST(-6.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (10, N'Saskatchewan (Hora del centro de Estados Unidos, GMT-06:00)', CAST(-6.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (11, N'Tegucigalpa (Hora de Honduras, GMT-06:00)', CAST(-6.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (12, N'Bogotá (Hora de la costa del Pacífico de Sudamérica, GMT-05:00)', CAST(-5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (13, N'Chicago (Horario de verano del centro de Estados Unidos, GMT-05:00)', CAST(-5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (14, N'Ciudad de México (Horario de verano de México, GMT-05:00)', CAST(-5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (15, N'Caracas (Hora de Sudamérica Occidental, GMT-04:30)', CAST(-4.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (16, N'Indiana (Horario de verano del este, GMT-04:00)', CAST(-4.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (17, N'La Paz (Hora de Sudamérica Occidental, GMT-04:00)', CAST(-4.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (18, N'Nueva York (Horario de verano del este, GMT-04:00)', CAST(-4.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (19, N'Brasilia (Hora estándar del este de Sudamérica, GMT-03:00)', CAST(-3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (20, N'Buenos Aires (Hora del este de Sudamérica, GMT-03:00)', CAST(-3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (21, N'Halifax (Horario de verano del Atlántico, GMT-03:00)', CAST(-3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (22, N'Recife (Hora del este de Sudamérica, GMT-03:00)', CAST(-3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (23, N'Newfoundland (Horario de verano de Terranova, GMT-02:30)', CAST(-2.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (24, N'Nuuk (Horario de verano de Groenlandia, GMT-02:00)', CAST(-2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (25, N'Atlántico Medio (Horario de verano del Atlántico Medio, GMT-01:00)', CAST(-1.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (26, N'Azores (Horario de verano de las Islas Azores, GMT)', CAST(0.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (27, N'ReykjavÍk (Hora de Greenwich, GMT)', CAST(0.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (28, N'Casablanca (Horario de verano de Marruecos, GMT+01:00)', CAST(1.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (29, N'Londres (Horario de verano de GMT, GMT+01:00)', CAST(1.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (30, N'África Occidental (Hora de África Occidental, GMT+01:00)', CAST(1.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (31, N'Ámsterdam (Horario de verano de Europa, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (32, N'Berlín (Horario de verano de Europa, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (33, N'El Cairo (Hora de Egipto, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (34, N'Madrid (Horario de verano de Europa, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (35, N'París (Horario de verano de Europa, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (36, N'Pretoria (Hora de Sudáfrica, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (37, N'Roma (Horario de verano de Europa, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (38, N'Estocolmo (Horario de verano de Suecia, GMT+02:00)', CAST(2.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (39, N'Amman (Horario de verano de Jordania, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (40, N'Atenas (Horario de verano de Grecia, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (41, N'Helsinki (Horario de verano de Europa del Norte, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (42, N'Istanbul (Horario de verano de Europa del Este, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (43, N'Nairobi (Hora de Nairobi, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (44, N'Riyadh (Hora de Arabia Saudita, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (45, N'Tel Aviv (Horario de verano de Israel, GMT+03:00)', CAST(3.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (46, N'Abu Dhabi (Hora de Arabia, GMT+04:00)', CAST(4.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (47, N'Moscú (Hora de Rusia, GMT+04:00)', CAST(4.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (48, N'Kabul (Hora de Afganistán, GMT+04:30)', CAST(4.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (49, N'Teherán (Horario de verano de Irán, GMT+04:30)', CAST(4.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (50, N'Bakú (Horario de verano de Bakú, GMT+05:00)', CAST(5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (51, N'Ekaterimburgo (Hora de Asia Occidental, GMT+05:00)', CAST(5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (52, N'Islamabad (Hora de Asia Occidental, GMT+05:00)', CAST(5.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (53, N'Colombo (Hora de Colombo, GMT+05:30)', CAST(5.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (54, N'Bombay (Hora de India, GMT+05:30)', CAST(5.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (55, N'Katmandú (Hora de Nepal, GMT+05:45)', CAST(5.45 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (56, N'Almaty (Hora de Asia Central, GMT+06:00)', CAST(6.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (57, N'Bangkok (Hora de Bangkok, GMT+07:00)', CAST(7.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (58, N'Pekín (Hora de China, GMT+08:00)', CAST(8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (59, N'Kuala Lumpur (Hora de Malasia, GMT+08:00)', CAST(8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (60, N'Perth (Hora de Australia Occidental, GMT+08:00)', CAST(8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (61, N'Singapur (Hora de Singapur, GMT+08:00)', CAST(8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (62, N'Taipei (Hora de Taipéi, GMT+08:00)', CAST(8.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (63, N'Seúl (Hora de Corea, GMT+09:00)', CAST(9.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (64, N'Tokio (Hora de Japón, GMT+09:00)', CAST(9.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (65, N'Adelaida (Hora estándar de Australia Central, GMT+09:30)', CAST(9.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (66, N'Darwin (Hora de Australia Central, GMT+09:30)', CAST(9.30 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (67, N'Brisbane (Hora de Australia Oriental, GMT+10:00)', CAST(10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (68, N'Guam (Hora del Pacífico Occidental, GMT+10:00)', CAST(10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (69, N'Hobart (Hora estándar de Tasmania, GMT+10:00)', CAST(10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (70, N'Sydney (Hora estándar de Australia Oriental, GMT+10:00)', CAST(10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (71, N'Yakutsk (Hora de Yakutsk, GMT+10:00)', CAST(10.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (72, N'Islas Salomón (Hora del Pacífico Central, GMT+11:00)', CAST(11.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (73, N'Vladivostok (Hora de Vladivostok, GMT+11:00)', CAST(11.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (74, N'Fiji (Hora de Fiyi, GMT+12:00)', CAST(12.00 AS Decimal(4, 2)))
INSERT [dbo].[cmon_timezone] ([timezoneid], [title], [OffSet]) VALUES (75, N'Wellington (Hora estándar de Nueva Zelanda, GMT+12:00)', CAST(12.00 AS Decimal(4, 2)))
SET IDENTITY_INSERT [dbo].[cmon_timezone] OFF

Espero que les sea de utilidad Guiño

viernes, 7 de setiembre de 2012

ASP.NET–Detecta las vulnerabilidades de tu aplicacion web

aspnet-attacksUna de las preguntas obligatorias que se hace un desarrollador de aplicaciones es:
“mi aplicación web será vulnerable en algún punto a ataques de delincuentes del ciberespacio?”
Y si no tienes mucha experiencia desarrollando sitios web, pues no tendrás idea por dónde empezar para detectar esas vulnerabilidades.
Y es posible que efectivamente estés haciendo una bomba de tiempo… por eso es necesario que encuentres alguna manera de testear si tu sitio web tiene agujeros de seguridad y puede ser hackeado.
Conforme un desarrollador va adquiriendo más experiencia, va aprendiendo cuáles pueden ser los puntos débiles que puede tener una aplicación web y entonces se preocupa por evitar que vulneren dichos agujeros… y le hará exigentes pruebas hasta encontrar cero vulnerabilidades (eso espero Guio).
Pero mientras tanto qué hacen?
Mientras tanto, pueden apoyarse de herramientas que realizan exámenes en línea, tal como lo hace https://asafaweb.com/
Así es, este web site le hace un examen integral a tu sitio ASP.NET en línea y te entrega un informe completo de las vulnerabilidades que halló en tu web site, y además te dice cómo puedes solucionar dichas fallas, añadiéndote enlaces para que estudies dichas vulnerabilidades y solucionarlas.
https://asafaweb.com/ es una herramienta muy útil, la cual se las recomiendo, al menos en una etapa inicial.
Espero que les sea de utilidad Guio

sábado, 18 de agosto de 2012

Ejecutar Visual Studio como Administrador

Para los que quieren evadir la opción de hacer click derecho sobre el ícono de Visual Studio y elegir "Ejecutar como Administrador" cada vez que abren Visual Studio, sigan estos pasos:

1.- Vayan al menú Inicio de Windows y hagan click derecho sobre el ìcono de Visual Studio (vean la imagen) y elijan propiedades



Aparecerá la ventana Propiedades, elijan la pestaña Compatibilidad y marquen el check de la parte de abajo 

Es todo, espero que les sea de utilidad ;)

jueves, 12 de julio de 2012

modules runAllManagedModulesForAllRequests=true bloquea imagenes y css

Hay un caso especial en el que se bloquean todos los archivos css e imágenes en tu página aspx… y ocurre antes de que el usuario se haya autenticado correctamente en el aplicativo  web.
noimage
El requisito fundamental es que estés usando autenticación por formularios.
Y todo es causado por esta entrada en el web.config:
<modules runAllManagedModulesForAllRequests="true"/>
Entonces, inclusive en tu página Login.aspx se niega la visualización de css e imágenes, originando que la página se vea sin estilos y deformada.
Otra consecuencia es que el aplicativo se comporta más lento, debido a que cada recurso del aplicativo es analizado antes de ser enviado al cliente.

Y por qué pasa esto?
En palabras claras, la intención de esa entrada en el web.config es restringir todos los recursos (incluyendo css e imágenes) hasta que el usuario se autentique correctamente.

Normalmente, no deberíamos bloquear ni las imágenes ni los estilos css.

Felizmente esta situación es fácil de resolver: simplemente debes quitar dicha entrada del web.config o en todo caso cambiarla a “false”.

Espero que les sea de utilidad Guiño

martes, 3 de julio de 2012

Nuestro quinto aniversario

Este mundo está avanzando a mil por hora!!

Me acabo de dar cuenta que este humilde blog ya cumplió 5 añitos en el mes de abril y no estuve alerta para escribir este Post en su momento.

Pero mejor tarde que nunca, así que aquí estamos:
Felices de cumplir un año más intentando compartir lo  que sabemos!!

Y aunque ya no tenemos el tiempo de antes, seguiremos aportando cuanto sea posible.

Como ha sido mi costumbre, acompañar el post de aniversario con la foto de mi pequeña hija... esta vez no será la excepción, ahora mi hija tiene ya 8 añitos.

Gracias por acompañarnos!!

miércoles, 20 de junio de 2012

ASP.NET– Aplicar CSS a RadioButtonList para que se vea como una lista de botones

asp.net-button-listHay ocasiones en las que queremos cambiar la apariencia de nuestros controles, para mostrar en las páginas cierta información.
Por ejemplo:
si quiero crear una encuesta, con preguntas de una sola respuesta… de inmediato se me ocurre que el control que se ajusta para este caso es el RadioButtonList. Y eso es cierto, pero qué pasa si Yo quisiera tener una lista de botones en lugar de radio buttons? que Yo recuerde, no hay un control que nos permita elegir una lista de botones ( ButtonList podría llamarse si existiera ).
Y dado que no existe, qué tal si nosotros usando un poco el ingenio lo creamos?
Con esta porción de código se obtiene que los radiobuttonlist se visualizen como una lista de botones…
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Lista de botones</title>

<style type="text/css">
* { font-family: Trebuchet MS; background-color: beige;}
.Buttons label
{
display: block;
border: solid 1px gray;
box-shadow: 2px 2px 2px gray;
padding: 5px 10px;
background-color: red;       
cursor: pointer;       
}


input[type="radio"]
{
display: none;       
}

input:checked + label 
{
background-color: Green;
color: White;
}            
</style>
</head>
<body>
<form id="form1" runat="server">
<p>
De qué color es el caballo blanco de San Martín?
</p>
<asp:RadioButtonList ID="rbl" runat="server" RepeatDirection="Horizontal" RepeatLayout="Table" CssClass="Buttons">
<asp:ListItem Value="1" Text="NEGRO" />
<asp:ListItem Value="2" Text="MARRÓN" />
<asp:ListItem Value="3" Text="BLANCO" />
</asp:RadioButtonList>
</form>
</body>
</html>

Y Juancito levanta la mano y pregunta: professor, professor… por qué simplemente no agrego varios botones y ya está?

Ay Juanito, te diré… la ventaja adicional es que puedes acceder al valor elegido al instante, con esta línea de código
string val = rbl.SelectedValue;

Si agregaras botones, tendrías que hacer artificios para guardar el valor del botón seleccionado cada vez que haces click en un botón… y algunas cosas más seguramente.

Uds podrían invertir un poquito más de tiempo y hacer que se vean mucho más parecido a un botón.

Espero que les sea de utilidad Guiño