sábado, 30 de enero de 2016
viernes, 29 de enero de 2016
miércoles, 27 de enero de 2016
martes, 26 de enero de 2016
lunes, 25 de enero de 2016
jueves, 21 de enero de 2016
miércoles, 20 de enero de 2016
lunes, 18 de enero de 2016
viernes, 8 de enero de 2016
2014 Projects
| Client/Company : Avianca/Avanade Project : Migracion, SharePoint, SQL, MVC Project Duration : June 2014 - Present Assigned Role : Application Lead
Liderando un equipo 5 personas
con alta exposición al cliente y frecuentes viajes, desarrollando tareas de
líder técnico, PM, generación de estimaciones y propuestas, ventas y
consultoría. primeramente comenzamos con un fix and Tuning SharePoint 2007 para
dos portales internos, split de base de datos SharePoint 2007 para cumplir con
recomendaciones del fabricantes, desarrollo custom para el copiado de Workflows
y Migración de SharePoint 2007 a SharePoint 2010 en Azure. Migración de SQL
2000, 2005, 2008 a 2012. ASP.net y ASP MVC para desarrollar nuevas
funcionalidades en el portal www.avianca.com.
|
|
|
|
Client/Company :
Dyson / Avanade Project : eShop/Sitecore MVP Project Duration : February 2014 - May 2014 Assigned Role : Application Lead Leadering this project, taking decision about technical implantations and manage 3 development, 1 tester and 2 graphic design resource. The project is an application development in SiteCore using asp.net implementing MVP and Interfaces. The application is www.dyson.com, acting as the primary point of contact. |
miércoles, 12 de marzo de 2014
2013 Projects
|
||||||
|
||||||
|
||||||
|
jueves, 12 de septiembre de 2013
jueves, 20 de junio de 2013
Principles
| Interface Segregation Principle (ISP) |
| Many client specific interfaces are better than one general purpose interface. |
| Liskov Substitution Principle (LSP) |
| Functions that use references to base class must be able to use objects of derived classes without knowing it. |
| Open Close Principle (OCP) |
| A software entity (classes, modules, functions) should be open for extensions, but should be closed for modifications. |
| Single Responsibility Principle (SRP) |
| Ther should never be more then one reason for a class to change. |
domingo, 16 de junio de 2013
domingo, 3 de marzo de 2013
2012 Projects
|
|
| ||
Client/Company : AVANADE
Project : NOVO NORDISK eLCMS
Project Duration : February 2012 - July 2012
Standard Role : Technical Architect Project & Role Description :
Leadering technically this project, taking decision about technical implantations and manage two resource.
SharePoint 2010 with custom Workflows in Visual Studio 2010 and custom forms with InfoPath 2010. The overall objective of the Product Portfolio Optimization Project is to ensure a continuously streamlined product portfolio characterized by low complexity, strategic alignment and reduced costs. |
domingo, 24 de febrero de 2013
Por: Lucas E. Luna
Introducción
Estamos trabajando en AVANADE participando de un proyecto de desarrollo para una compañía farmacéutica. Estamos realizando un sitio web basado en SharePoint 2010 que utilizaran los empleados para gestionar el ciclos de vida de los productos, mediante unos formularios InfoPath que tendrán proceso de aprobación o rechazo que determinaran la ejecución del Workflow.
Necesidad
Necesitamos que los Workflows se detengan hasta que haya un nuevo cambio determinado por el usuario. El problema fue no tener en cuenta el CorreletionToken
Solución
Agregar un control de InitializeWorkflow y Sequence para crear un nuevo Token.
Para explicar crearemos un nuevo proyecto y armaremos un Workflow con algunos controles. El Workflow debería detenerse antes OnWorkflowItemChanged esperando seguir cuando haya un cambio en el ítem.
Todo Workflow empieza con OnWorkflowActivated y tiene asociado un Correlation Token.
· Un Correletion Token se puede considerar como un identificador único, que serviría para que el flujo se comunique. Este toquen se le asocia a un control.
Este Correlation Token se genere en el Designer.cs del Workflow, como todo control que se agrega.
Y algunos controles tiene un Correlation Token asociado, como es el onWorkflowsActivated.
NOTA: Los componentes de Designer.cs se general automáticamente al agregar controles, mover, eliminar o cambiando propiedades. Es recomendante tratar de no mover controles del Worflow porque quedan “residuos” en ese archivo que puede dar un mal funcionamiento. Lo ideal es que si se quiere mover un control es eliminarlo y volverlo a agregar desde la Toolbox.
Diseñaremos un Workflow básico que se deploya en una List de SharePoint, en donde este se debería detenerse en cada control OnWorkflowItemChange (cada vez que el Ítem cambie el valor en algún campo) sin usar el control InitializeWorkflow para generar un Token nuevo.
Al agregar un Ítem el Workflow se activa, muestra un mensaje “Primero” en el Workflow History y queda detenido hasta que un cambio se produzca.
Hasta ahora el Workflow funciona como lo diseñamos. Cuando vamos a modificar algún campo del Workflow, ese continuara su ejecución. Deteniéndose en el próximo control OnWorkflowItemChange.
Al observar el ítem el estado del Workflow aparece Completed, y si vemos el History podemos notar por el historial que no se debuto en el control OnWorkflowItemChange y el Workflow finalizo.
Esto pasa porque al tener el mismo token el evento ejecuta todos los eventos ya que no tienen forma de diferenciar a que actividad corresponde.
La solución es generar un nuevo Token cada vez que se va a utilizar algún control como ese. Y para diseñarlo debemos usar el control InitializeWorkflow, que se encuentra en la Toolbox, también podemos usar el control Sequence, que se usa como contenedor.
Para generar un nuevo Token, primero agregamos el control Sequence. Y ahí adentro vamos a poner el InitializeWorkflow.
Y en las propiedades del InitializeWorkflow podemos genererar el nuevo Token, asociado a nuestra Sequence. En CorrelationToken ingresamos un nombre, “Token1”, y en OwnerActivityName la Sequence, en este caso el nombre del control, “sequenceActivity1”.
Y luego asociamos a nuestro control OnWorkflowItemChange el Token que creamos. También a todos los controles que estén en esta Sequence asociarle el Token creado, si lo requiere.
Así nuestro flujo no se finalizara sin esperar algún control.
Este es un pequeño ejemplo de como hicimos uso de este control teniendo un perfecto funcionamiento del Workflow.
Si dentro del Workflow tenemos código que modifican el ítem, es posible que disparen otros eventos y entre en un bucle no deseado. Para eso lo ideal es congelar los eventos y hacer las modificaciones al ítem y luego activar los eventos con esta Clase.
Creamos una instancia a la clase y utilizamos el método DisableHandleEventFiring() para desactivarlo y el método EnableHandleEventFiring() para volver a activar los eventos.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint;
namespace SharePoint.Core
{
public class HandleEventFiring : SPItemEventReceiver
{
public void DisableHandleEventFiring()
{
//obsolete
//this.DisableEventFiring();
this.EventFiringEnabled = false;
}
public void EnableHandleEventFiring()
{
//obsotete
//this.EnableEventFiring();
this.EventFiringEnabled = true;
}
}
}
|
martes, 21 de agosto de 2012
ASP.NET - Encriptando y Desencriptando el web.Config
ASP.NET - Encriptando
y Desencriptando el web.Config
con Sebastian Zangaro
Aumentar la seguridad del archivo web.Config cifrando
secciones del mismo utilizando el proveedor de configuración protegida RSA y la
herramienta Aspnet_regiis, y así dificultar el acceso a la información
almacenada en el mismo.
Procedimiento
Una vez que tenemos identificada la sección o secciones que
vamos a cifrar, y que tenemos el proveedor de configuración, podemos proceder
con el primer paso. Es recomendable encriptar la sección de connection string o
cualquiera que contenga datos sensibles como passwords.
Recomendaciones
Antes de realizar alguna operación, y periódicamente es
recomendable realizar un backup del archivo encriptado.
Como obtener el ID del Site:
Antes de cualquier operación es
recomendable obtener el ID del Site al que le queremos cifrar el archivo
web.config, machine.config, etc. Este ID se puede obtener de varias maneras
como por ejemplo desde el archivo log.
En lo personal el método más fácil y
rápido es el siguiente:
a-Abrir el IIS Manager:
Puede encontrarse dentro de “Administrative Tools”b-Abrir la Configuración Avanzada:
Expandir “Sites”, ubicar el Site
del cual se va a obtener el ID, en este caso “Newsletter – 1337”, click
derecho, buscar la opción dentro de “Manage Web Site” y hacer click en
“Advanced Settings…”.
Copiar ID:
Dentro de “(General)”, se podrá
observar el ID.
Encriptar archivo web.config:
Ejecutar Command Prompt:
Ejecutamos
con privilegios elevados (Como administrador) el Command Prompt de Visual Studio. Si no aparece dicha opción,
manteniendo apretada la tecla “Shift”, hay que darle clic derecho al Command
Prompt”.
Escribir la siguiente línea de comando:
aspnet_regiis
-pe "appSettings" -app "/" -site "SITE_ID" -prov "RsaProtectedConfigurationProvider"
NOTA: Remplazar SITE_ID por el ID obtenido
en el punto 1.3.
Explicación sobre los parámetros:
·
-pe/-pd es el comando para encriptar o
desencriptar respectivamente.
·
Lo que le sigue a la acción que se va a hacer es
la sección, en este caso es “appSettings”. Vale aclarar que es otros casos tal
ves es necesario ingresar la ruta completa, como por ejemplo
“system.web/pages”.
·
El parámetro -app es para identificar la Aplicación
de la cual se va a encriptar el web.Config. Lo siguiente a este parámetro debe
ser una barra seguida del nombre de la aplicación.
·
El parámetro -site es para decirle a que Site
corresponde. Hay que ponerle el id, que se puede obtener desde distintas
maneras como por ejemplo desde el log. Para más información click aquí.
·
El parámetro -prov corresponde al Provider o
proveedor de configuración utilizado para cifrar. En el caso de desencriptar no
hace falta especificarlo. Este provider se puede cambiar, o se puede crear uno
custom.
Ejemplo del resultado obtenido:
Sección connectionStrings de un web.config que todavía no fue cifrado:
Sección connectionStrings de un web.config que cifrado:
Excepciones en cuanto a secciones:
Para las
secciones a encriptar existen algunas excepciones como por ejemplo:
·
<processModel>
·
<runtime>
·
<mscorlib>
·
<startup>
·
<system.runtime.remoting>
·
<configProtectedData>
·
<satelliteassemblies>
·
<cryptographySettings>
·
<cryptoNameMapping>
·
<cryptoClasses>
Para
encriptar estas secciones hay que usar la herramienta aspnet_setreg.exe (Microsoft Knowledge Base
articulo 329290).
Que hacer con una solución local:
Los pasos
son muy parecidos a los especificados en el punto 2, con la diferencia que en lugar de
utilizar -pe/-pd, los comandos a utilizar deben ser -pef/-pdf respectivamente.
¿Pero entonces hay que modificar la programación para adaptarla a este cambio?
La respuesta es no, ASP.Net internamente se encarga de
desencriptar automáticamente el contenido del web.config. Se puede realizar una
prueba con la siguiente línea:
Response.Write(ConfigurationManager.ConnectionStrings["cn1"].ConnectionString);
Errores generales con los que me encontré:
·
RSA
key container could not be opened.
Esto ocurre cuando el usuario no tiene los permisos necesarios
para acceder al key container. Para solucionar este error, hay que ejecutar alguna
de las siguientes instrucciones:
o
aspnet_regiis
-pc "NetFrameworkConfigurationKey" -exp
o
aspnet_regiis
-pa "NetFrameworkConfigurationKey" "ASPNET"
o
aspnet_regiis
-pa "NetFrameworkConfigurationKey" "NETWORK SERVICE"
o
aspnet_regiis
-pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK
SERVICE"
Donde “NetFrameworkConfigurationKey” es la RSA key que se
puede obtener en el machine.config, ubicado como por ejemplo en la ruta “%WinDir%\Microsoft.Net\Framework\v2.0\Config”,
bajo la sección configProtectedData; y el ultimo parámetro es la cuenta donde
se está ejecutando el servicio asp.net, es decir la cuenta a la cual se le
desea asignarle permisos.
Cabe aclarar que dependiendo el caso puede ser necesario
especificar el domain.
Para
obtener la identidad bajo la cual se ejecuta la aplicación, se puede utilizar
la siguiente línea:
Response.Write(WindowsIdentity.GetCurrent().Name);
Referencias
Suscribirse a:
Entradas (Atom)



































