Hi there!!!, Esta es primera participación en este Blog y bueno aqui estoy trayendo a ustedes algo que sin duda les será de mucha utilidad,
les comento en que consiste:
- Hace poco me dijierón que deseaban una aplicacion Web en la cual de entrada, la persona que quisiera hacer
uso de ella no necesitara ingresar su UserName ni su Password en un Formulario; que cuando la persona
metierá la dirección URL en el Browser internamente validará que el nombre de usuario que esta dentro de la
maquina exista en Directorio Activo (Exacto, la maquina tiene que estar en Dominio para poder entrar utilizando
Internet Explorer, con FireFox y otros Browsers, siempre pide Usuario y Contraseña, y si este nombre de usuario no existe en el Directorio Activo los saca automaticamente la aplicación)
y luego buscar sus Capacidades para este Usuario en la aplicación Web que hemos desarrollado... ¿Suena fácil no?
En realidad lo seria si no fuera por que no existe mucha información al respecto en Internet, aqui les traigo la
solución, el código esta perfectamente explicado con comentarios:
Primero en el WebConfig pongan en el Tag de <authentication mode="Windows">, para que de esta forma puedan acceder solo de la manera explicada. Ahora vayan a su Global.asax al método de Session_Start
void Session_Start(object sender, EventArgs e)
{
try
{
String lUserTest = Environment.UserName; //Con esta instrucción se recupera el nombre de usuario que
//Tiene la maquina de la persona que se intenta logear en la
//página WEB.
if (lUserTest != null && lUserTest.ToString().Trim() != String.Empty)
{
Session["User"] = lUserTest;
FindCapabilities(lUserTest); //Buscamos en Directorio Activo si el usuario Existe, en caso de Existir
//nos traemos sus capacidades.
}
else
{
}
}
catch (Exception ex)
{
//Atrapamos la exepción y la metemos en un Log de Eventos del Sistema.
}
}
private void FindCapabilities(String lUserTest)
{
try
{
UnObjetoNegocio objValActiveDirec = new UnObjetoNegocio(),
int lIdUsuario = 0;
//Por default los ponemos nulos todas las variables de Sesión.
if (UnObjetoNegocio.VALIDA_AD_USER(lUserTest)) //Este Método debe ser llevado
//por seguridad a otra clase privada por seguridad más adelante pongo las
//el método para que vean como se busca sin contraseña. Este método regresa
//un boleano si el usuario existe en Directorio Activo.
{
lIdUsuario = UnObjetoNegocio.EncuentraIDUsuarioSSP(lUserTest); //Ahora que nos aseguramos que exite,
//buscamos el ID de usuario en nuestra aplicación.
if (lIdUsuario > 0)
{
//Ahora buscamos sus Llenamos variables de Session Indicando sus Capacidades.
}
}
}
catch (Exception ex)
{
//Metemos en Bitacora de Errores.
}
finally
{
}
}
void Session_End(object sender, EventArgs e)
{
// Código que se ejecuta cuando finaliza una sesión.
// Nota: El evento Session_End se desencadena sólo con el modo sessionstate
// se establece como InProc en el archivo Web.config. Si el modo de sesión se establece como StateServer
// o SQLServer, el evento no se genera.
//NOTA: Borramos todas la variables de Sesión que utilizamos para la administración de la Capacidades.
}
public bool (string sUserName)
{
try
{
DirectoryEntry entry = new DirectoryEntry(sLDAP, sDomainAndUsername, sPwd);
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(&(objectCategory=user)(objectClass=person))";
SearchResult results = search.FindOne();
if (results != null)
{
}
return true;
}
catch (Exception ex)
{
//Metemos en Bitacora de Errores.
return false;
}
}
// **************************** Esto debe estar Preferentemente en una Capa de Negocio, además van
// a necesitar esta referencia:
// using System.DirectoryServices;************
///
/// Obtiene los datos de un usuario valida que exista en directorio activo
///
///
public bool VALIDA_AD_USER(string username)
{
//Estos deben estar encriptados en el WebConfig. Y son reservados solamente para la aplicación
//con esto se va a buscar en AD.
string sLDAP = ConfigurationManager.AppSettings["LDAP"].ToString();
string sDomain = ConfigurationManager.AppSettings["Dominio"].ToString();
string sUsername = ConfigurationManager.AppSettings["Usuario"].ToString();
string sPwd = ConfigurationManager.AppSettings["Password"].ToString();
string sDomainAndUsername = sDomain + @"\" + sUsername;
string sResult = "";
try
{
DirectoryEntry entry = new DirectoryEntry(sLDAP, sDomainAndUsername, sPwd);
object obj = entry.NativeObject;
String lUserTest = Environment.UserName;
DirectorySearcher search = new DirectorySearcher(entry);
search.Filter = "(&(objectCategory=person)(sAMAccountName=" + username + "))";
search.PropertiesToLoad.Add("cn");
SearchResult result = search.FindOne();
if (null == result)//Con el simple hecho que no sea nulo es que ya encontro el usuario.
{
String sResult = "";
//Aqui no lo utilizo pero por si lo necesitan esto es:
sResult = results.Properties["cn"][0].ToString(); //Su puesto
sResult = results.Properties["mail"][0].ToString();//Su mail
sResult = results.Properties["name"][0].ToString();//Nombre completo.
return false; //No permitimos que vaya a buscar en la aplicación sus Capacidades
}
return true;//Autorización para buscar Capacidades.
}
catch (Exception ex)
{
//Metemos en la Bitacora de Errores de Sistema.
return false;//No permitimos que vaya a buscar en la aplicación sus Capacidades
}
}
Como siempre sucede, cuando algo ya se sabe, pues es muy fácil de otra forma
pues... ( jojo el Obvio y sus cuates).
Traido a ustedes por Omar Fermin Romero Tovar. Hasta pronto.
Buscar en el blog
Authentification Mode Windows con Active Directory
a la/s 12:44 a.m. 0 comentarios Etiquetas: Authentification Windows Active Directory C#.NET ASP.NET
Silverlight Mashup
Les recomiendo un nuevo portal denominado muunyal, emplea el concepto de Mashup sobre una plataforma completamente Silverlight 2.0, es un concepto interesante de integración de información mediante RSS y APIs de las principales redes sociales como Flickr, Facebook, twitter, etc. en un solo lugar denominado muunyal.
Analizando el Portal no cabe duda que es un startup... vemos que su idea es tener en un solo punto la información que comparten los ciudadanos de internet, quienes tienen la opción de configurar sus diferentes redes sociales y RSS para que sus seguidores puedan consultar la información y mantenerse actualizados de los diferentes cambios en toda la nube, ahora se encuentra en una versión Beta 1.o pero se ve muy prometedor.
En la parte tecnológica es bien interesante como utilizaron Silverlight para las funcionalidades de drag and drop, contacte a los desarrolladores y me comentan que trabajaron con servicios RES del framework 3.5 de .NET para la integración con Flickr, así como con Silverlight Streaming para reproducción de video dentro de un Widget.
Esta iniciativa de mashups es una tendencia, la colaboración y web 2.0 se ven fortalecidas con soluciones y conceptos de este tipo.
Existen fabricantes de software que han desarrollado algunos productos interesantes, tal es el caso de una empresa Mexicana llamada Jackbe que tiene una solución para Sharepoint.
Les comparto un video interesante para conocer más de mashups
Felices mezclas....
a la/s 9:06 p.m. 0 comentarios
Silverlight-De que se compone
Bueno, antes de explicarles de que se compone una aplicación silverlight veamos que es lo que necesitamos instalar en nuestro ambiente para crear este tipo de aplicaciones.
- Visual Studio 2008
- Silverlight Tools for Visual Studio 2008 SP1
- Visual Studio 2008 SP1
- Microsoft Expression Blend 2 (Opcional)
Les comento que también pueden utilizar la versión express Visual Web Developer Express with SP1 para desarrollar aplicaciones de silverlight en caso de que no cuenten con visual studio 2008.
Ahora si veamos como podemos crear una aplicación silverlight y de que se compone.
Abrimos visual studio 2008 o en su caso Visual Web Developer Express, damos clic en agregar un nuevo proyecto y seleccionamos de la plantilla "Silverlight" ya sea en visual basic o C# dependiendo de cual sea el caso y finalmente seleccionamos "Silverlight Application". Ingresamos el nombre de nuestra aplicación y la ruta en donde queremos que se guarde.
Les va a pedir que seleccionen en donde quieren que se hostee su aplicación de silverlight, tenemos 3 opciones, la primera es en una pagina html, la segunda es en un ASP.NET Web Application Project y la tercera es en un ASP.NET Web Site. Seleccionamos la tercera opción.
Bien, despues de que creamos el proyecto de silverlight analicemos de que se compone este tipo de proyectos. En su explorador de soluciones(Solution Explorer) si se dan cuenta tenemos dos aplicaciones, un ASP.NET Web Site y un Silverlight Application. La primera es donde vamos a hostear nuestra aplicación silverlight y la segunda es todo nuestro proyecto de silverlight. En nuestro segunda proyecto podemos ver que solamente tenemos dos archivos con extension .XAML, pero que es ese tipo de extension? Ok, veamos:
XAML o "Extensible Application Markup Language" es una lenguaje de marcado basado en XML y que se utiliza como lenguaje con el cúal creamos nuestra capa de presentación en aplicaciones Silverlight y Windows Presentation Foundation.
Ok, veamos que también tenemos un archivo App.xaml, este archivo no es mas que nada que nuestro archivo de configuración de nuestra aplicación(¿recuerdan que en ASP.NET tenemos un Web.Config? a pues es algo similar en Silverlight)
Ahora veamos nuestra aplicación ASP.NET. Yo creo que no es necesario que les explique para que es cada archivo, yo creo que cuentan con los conocimientos basicos de este tipo de aplicaciones.
Bien, si se dan cuenta yo le asigne el nombre de "MiPrimeraAplicacionSilverlight" a mi proyecto, en mi asp.net veamos que tenemos un WebForm(.aspx) llamado "MiPrimeraAplicacionSilverlightTestPage.aspx", pero ustedes saben porque el "TestPage"? Bueno, en este WebForm es donde vamos a hostear nuestra aplicación de silverlight, ojo, no es necesario que solamente en ese archivo muestren su aplicación pueden hacerlo en donde ustedes quieran.
Vamos a ver de que se compone:
Ok, veamos como en la parte superior de nuestro WebForm tenemos una referencia a un NameSpace "System.Web.UI.SilverlightControls" y al cual se le agrega un prefijo "asp". Pero se han de preguntar para que? Ok la respuesta es: Este Namespace es un set de controles con los cuales podemos mostrar cosas hechas en silverlight, como por ejemplo: Podemos reproducir un video con un reproductor hecho en silvelright o podemos ver una aplicación en silverlight en un hosteador. Cabe mencionar que solo nos proporcionan dos controles como antes lo dije: un reproductor y un hosteador de aplicaciones silverlight. Es importante que sepan lo siguiente:
Estos controles solamente los podemos utilizar en ASP.NET 3.5, no podemos utilizarlos en la version 2.0. Pero se han de preguntar el como pueden mostrar una aplicación silverlight en un ASP.NET 2.0? Es sencillo y lo explicaré en la siguiente publicación.
Bien, por último si se dan cuenta tenemos un control llamado "silverlight" este control es el que les mencionaba anteriormente y el cual nos sirve para hostear nuestra aplicación, es importante que agreguen un control ScriptManager de Ajax del framework 3.5 ya que sin el la aplicación al momento de correrla nos lanzará un error en tiempo de ejecución diciendo que el control "silvelright" no puede trabajar sin el script manager.
Ahora veamos las propiedades de nuestro control:
- ID: "Identificador de nuestro control"
- runat: "Debe de ser un control de servidor y se le debe de asignar la propiedad server"
- Source: "Ruta donde se encuentra nuestro archivo .XAP(Mas adelante veremos que es este archivo)"
- MininumVersion: "La versión minima de silverlight que correra en nuestra aplicación"
- Width: "Ancho de nuestra aplicación Silverlight"
- Height: "Alto de nuestra aplicación Silverlight"
¿Que es archivo .XAP? <-- Es un archivo que tiene algoritmo similar a los archivos .ZIP, es un archivo comprimido en el cúal vienen todas las librerias necesarias para que nuestra aplicación de silverlight corra sin problemas, hay un punto importante, con el archivo .xap, si lo agregamos a una pagina html comun y corriente sin tener instalado el framework 2.0, 3.5, etc..., podremos ver nuestra aplicación de silverlight sin problemas ya que se maneja como flash, solamente se tiene que bajar un plugin(y este te lo pide silvelright en caso de que detecte que en tu equipo no se encuentra instalado) y listo podremos ver nuestras aplicaciones sin la necesidad de tener instalado algun framework.
En las siguientes entradas haremos un ejemplo sencillo en silverlight.
Espero les sea de mucha utilidad esta información y espero sus comentarios.
a la/s 12:37 p.m. 0 comentarios
Como crear un KPI Anidado en Performancepoint Monitor (PPM)
Dentro de PPM estos KPIs son conocidos como KPI Objective pero debido a que la traducción al castellano no me dice mucho yo los llamo KPIs anidados; para ello crea tus KPI de manera habitual, es importante señalar que los KPI padre no deben llevar “valor actual” ya que este se obtendrá del resultado de los KPI hijos, por ello en la columna Calculation escoge la opción que más se adapte a tus necesidades para que a partir de ahí se obtenga el valor actual del KPI padre, el target se establece como siempre.
Una vez que tengas listos tus KPIs agrégalos a un Scorecard como lo haces de manera normal pero siempre colocando al KPI padre encima de los KPI hijos, el KPI padre será aquel que dependa del resto de los KPI y por ende los KPI hijos serán aquellos de los que depende el KPI padre, es importante que respetes esta jerarquía al ir agregándolos al Scorecard porque sino, no podrás anidar los KPIs de manera adecuada.
Estando en el Scorecard posiciónate en el primer KPI hijo en la columna que tiene el nombre del KPI y en la pestaña Edición se habilitarán las opciones Increase Level y Decrease Level, al darle Increase Level el KPI se correrá un poco a la derecha de tal manera que visualmente se verá que el KPI hijo está dentro del KPI padre, sigue estos pasos para el resto de los KPI hijos hasta que todos queden dentro del padre, también puedes usar el método abreviado Ctrl + Flecha Izquierda para Decrease Level y Ctrl + Flecha Derecha para Increase Level.
En el menú Create hay un botón que dice Update, puedes dar clic en él e ir visualizando como se verá tu KPI, de igual manera puedes ir dándole formato a cada celda, puedes cambiar tipo y tamaño de letra así como los colores de fondo y listo, has creado KPIs anidados.
a la/s 9:23 p.m. 0 comentarios Etiquetas: KPI Performancepoint Dashboard Designer sharepoint MOSS BI
MOSS 2007 y los problemas de compatibilidad de 64 bits.
Si bien es cierto que MOSS 2007 a 64 bits no es un producto que salió ayer también es cierto que muchos de los programas a los que MOSS se puede conectar para obtener información aun no están disponibles en dicha plataforma lo cual se convierte en una verdadera ancla al momento de querer zarpar y explorar el mundo de los 64 bits, para muestra les doy 3 ejemplos con los que me he encontrado en este bimestre:
* Proclarity debe tener el IIS a 32 bits y Windows Server 2008, SQL Server 2005 y MOSS 2007 están instalados a 64 bits y necesitan IIS en esa plataforma, el problema radica en que el IIS no puede trabajar de manera simultánea a 32 y 64 bits.
* Dashboard Designer no permite crear PivotTable, PivotChart y TrendAnalysis Chart ya que estos requieren de Microsoft Office Web Component los cuales solo existen en 32 bits y son incompatibles con la plataforma de 64 bits. (Office Web Components are not supported on PerformancePoint Server 64-bit deployments. These components are 32-bit only and are not compatible with the 64-bit implementation of PerformancePoint Server even though these components may run on a 64-bit computer when 32-bit Internet Explorer hosts the Office Web Components. This is a known issue and is not supported)
* Los conectores para FileNet como son Microsoft Enterprise Search Indexing Connector 2008 for IBM FileNet asi como el IBM FileNet Connectors for SharePoint proporcionado por IBM no se pueden ejecutar debido a que FileNet solo corre en 32 bits (Reason: IBM FileNet does not support 64-bit architecture; this means that the connector, which depends on the IBM FileNet classes, cannot be installed on a 64-bit machine.)
La solución más común que he escuchado es, ¿porque no instalar todo a 32 bits en tu servidor de 64 bits?; pero la mayoría de los equipos están siendo manufacturados a 64 bits, el “futuro” ya nos alcanzó y no podemos hacer nada sino correr a la par de él, además en meses pasados Microsoft anunció los prerrequisitos para Sharepoint Server 2010 y uno de ellos son los 64 bits, ya no habrá más Sharepoint a 32, claro que para nuestra buena suerte Ploclarity y Dashboard Designer ya vendrán integrados con Sharepoint, la preguntá es que pasará con aquellas instalaciones que usan el Add-on de FileNet o demás aplicaciones que no se actualizan, ¿tendremos que dejarlas a 32 bits por siempre? ó ¿Los proveedores de estas las lanzarán en versión de 64 bits?, yo espero que sea lo segundo pero por ahora no hay más camino que la resignación ante estos 3 problemas de compatibilidad y la paciencia hasta la llegada de Sharepoint 2010.
SQL Injection
SQL Injection se le conoce como un ataque contra un gestor de bases de datos relacionales el cuál aprovecha la vulnerabilidad de una aplicación hecha en cualquier lenguaje. Sin embargo existen varias soluciones para este problema, las cuáles las voy a nombrar mas adelante.
Normalmente donde se aplica este problema es en la autentificación de las aplicaciones, en donde nos encontramos con una caja de texto donde ingresamos el usuario y otra caja de texto donde va el password. Veamos un ejemplo sencillo:
Cuando uno se logea a una aplicación la consulta por lo regular sería:
Nota: El nombre de la tabla y de las columnas es un ejemplo, estas pueden variar dependiendo de su base de datos.
Podemos decir que hasta donde vamos ¿esta todo bien no? Pero ¿que pasaría si ponemos lo siguiente en la caja de texto de userName o Usuario?
Vamos a poder acceder a la aplicación sin ningún problema, ¿Por qué?, aquí te lo explico:
La consulta original se encuentra aquí:
Select * From Usuarios Where id = 'parametro' And pwd = 'parametro'
Ahora vean como quedaría si le pusieran esa línea de código en el userNamer o usuario:
Select * From Usuarios Where id = '' or 1 = 1 --' And pwd = 'parametro'
¿Ya vieron la diferencia? Lo que hace la primera apostrofe es cerrar el valor depositado en la columna id en donde su valor es igual a nada y enseguida pone una condición la cual va a ser verdadera y al último lo que se pone son 2 guiones, esto es para que apartir de ahí se comente lo que resta de la consulta. Entonces ven como es algo tan sencillo el accesar a la aplicación?
Esto es una de las cosas mas sencillas que se pueden hacer, pero que pasaria si en vez de poner una condición para que nos deje entrar a la aplicación ponemos un drop table(con esto eliminamos una tabla de la base de datos), estariamos en un grave problema ya que por lo regular no acostumbramos a hacer respaldos de nuestras bases de datos y aplicaciones.
Soluciones
Existen varias soluciones para prevenir este tipo de ataques, a continuación las menciono:
- Mediante el control de validación de .Net que es el RegularExpressionValidator, el cuál nos va a validar que se ingresen solamente letras y numeros
- No utilizar usuarios con permisos de administrador al momento que se realiza la conexión a la base de datos, ya que esto permitiria hacer uso del Drop Table lo cuál sería fatal.
- Utilizar stored procedures ya que estos están protegidos contra los ataques del Sql Injection.
Desde mi punto de vista y opinión, la mejor solución sería utilizar los stored procedure ya que son más rapidos y no se tiene que hacer absolutamente nada para protegerse del SQL Injection ya que estos están protegidos a estos ataques.
A continuación te pongo algunos ejemplos de lo que pueden hacer los ataques de Sql Injection
- '; drop table Usuarios –- ß Con esto se eliminaria la tabla de usuarios, cosa que sería fatal que sucediera.
- ' having 1=1-- ß Manda el siguiente mensaje de error:
Column 'Usuarios.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ßCon esto se obtiene el nombre de la Tabla y la primera columna del Query que se está ejecutando. - ' group by Usuarios.Id having 1=1-- ß Manda el siguiente mensaje de error:
Column 'Usuarios.Usuario' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. ß Se Obtiene la segunda columna del Query al igual que el nombre de la tabla. - ' union select sum(Usuario) from Usuarios-- ß Manda el siguiente mensaje de error:
Operand data type char is invalid for sum operator. ß Se obtiene el tipo de dato de la columna a la cuál se quiere realizar la sumatoria. Nota: El union como todos los saben se tiene que realizar con el mismo numero de columnas que se esten llamando en el Query, en este ejemplo solamente se manda a llamar a la columna Usuario en el Query. - '; insert into Usuarios values('attacker', 'attacker','attacker', '1', 'Nothing', '666', '20041110' )-- ß Inserta un nuevo registro de la tabla seleccionada. Nota: Quien esté realizando el ataque tiene que ejecutar varias veces el punto 2 y 3 para obtener todas las columnas y su tipo de la tabla para poder insertar el nuevo registro.
- ' union select @@version,'1','1','1','1','1','1','1'-- ß Manda el siguiente error:
Conversion failed when converting the nvarchar value 'Microsoft SQL Server 2005 - 9.00.1406.00 (Intel X86) Mar 3 2007 18:40:02 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.1 (Build 2600: Service Pack 2) ' to data type int. ß Se obtiene la versión de la base de datos. - ' union select min(Usuario),'1','1','1','1','1','1','1' from Usuarios where Usuario > 'a'-- ß Manda el siguiente error:
Conversion failed when converting the varchar value 'inquil ' to data type int. ß Con esto lo que obtiene es el nombre de un Usuario que empiece o que la condición 'a' sea la más cercana a los nombres de los usuarios de la tabla, que en este caso puso dio como resultado el usuario “inquil”.
' union select Contraseña,1,1,1,1,1,1,1 from Usuarios where Usuario = 'inquil'-- ß Manda el siguiente error:
Conversion failed when converting the nvarchar value 'inq1448 ' to data type int. ß Con esto se obtiene el password del usuario en el cuál se metió en la condición.
Estos son algunos de los ejemplos de lo que pueden hacer los ataques de Sql Injection, esta bastante interesante este tema , por lo tanto los invito a protegerse en de estos ataques manejando las soluciones que les mencione anteriormente.
a la/s 11:05 p.m. 0 comentarios Etiquetas: Ataques SQL, Seguridad BD, SQL Injection
Silverlight 2.0
Microsoft Silverlight es la siguiente generacion de .Net. Con esta nueva tecnologia podrás crear aplicaciones web ricas e interactivas. Para poder trabajar con Silverlight deberás tener instalado el framework 3.5 de Microsoft y como recomendacion visual studio 2008, para poder crear este tipo de aplicaciones te invito a que visites la pagina de silverlight, ya que ahi viene especificado todo lo que se necesita para desarrollar con esta nueva tecnologia.. Para poder visualizar las aplicaciones hechas en silverlight se tiene que instalar en el cliente un plugin que pesa aproximadamente como 1 Mb. Muchos dicen que silverlight es la competencia de Flash, sin embargo les puedo decir como un punto de vista personal que silverlight en 2 o 3 años superará a Flash. Actualmente microsoft sacó la nueva version de silverlight(2.0) la cuál ya cuenta con la mayoria de los controles que se manejan en .Net(Butons, TextBoxs, etc…), por experiencia propia con esta nueva release nos facilita la vida en el desarrollo de aplicacion web ya que en la version 1.1 si queriamos utilizar estos controles teniamos que bajar componentes como son: ComponentOne y Telerik , entre otros. Bueno pues por el momento los dejo, espero sus comentarios o dudas. En los proximos blogs empezare a poner ejemplos de como utilizar esta nueva tecnologia.
a la/s 10:37 p.m. 0 comentarios Etiquetas: .NET, Microsoft, silverlight, Visual Studio 2008