jueves, 27 de octubre de 2011

seguridad en ASP.NET (C#)

En el Web.config.

<authentication mode="Forms">

   <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx"

   protection="All" path="/" timeout="30" />

</authentication>

 



<authorization>

   <deny users ="?" />

   <allow users = "*" />

</authorization>



private bool Validar_Usuario( string userName, string passWord )

{

SqlConnection conn;

SqlCommand cmd;

string lookupPassword = null;



// Check for invalid userName.

// userName must not be null and must be between 1 and 15 characters.

if ( (  null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ) )

{

System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );

return false;

}



// Check for invalid passWord.

// passWord must not be null and must be between 1 and 25 characters.

if ( (  null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ) )

{

System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );

return false;

}



try

{

// Consult with your SQL Server administrator for an appropriate connection

// string to use to connect to your local SQL Server.

conn = new SqlConnection( "server=localhost;Integrated Security=SSPI;database=pubs" );

conn.Open();



// Create SqlCommand to select pwd field from users table given supplied userName.

cmd = new SqlCommand( "Select pwd from users where uname=@userName", conn );

cmd.Parameters.Add( "@userName", SqlDbType.VarChar, 25 );

cmd.Parameters["@userName"].Value = userName;



// Execute command and fetch pwd field into lookupPassword string.

lookupPassword = (string) cmd.ExecuteScalar();



// Cleanup command and connection objects.

cmd.Dispose();

conn.Dispose();

}

catch ( Exception ex )

{

// Add error handling here for debugging.

// This error message should not be sent back to the caller.

System.Diagnostics.Trace.WriteLine( "[ValidateUser] Exception " + ex.Message );

}



// If no password found, return false.

if ( null == lookupPassword )

{

// You could write failed login attempts here to event log for additional security.

return false;

}



// Compare lookupPassword and input passWord, using a case-sensitive comparison.

return ( 0 == string.Compare( lookupPassword, passWord, false ) );



}





Generar el vale de autenticación
Cifrarlo
Crear una cookie
Agregarla a la respuesta y redirija al usuario.

Esto le ofrece más control sobre cómo crear la cookie. También puede incluir datos personalizados junto con FormsAuthenticationTicket en este caso.





private void cmdLogin_ServerClick(object sender, System.EventArgs e)

{

   if (Validar_Usuario(txtUserName.Value,txtUserPass.Value) )

   {

      FormsAuthenticationTicket tkt;

      string cookiestr;

      HttpCookie ck;

      tkt = new FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now,

DateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data");

      cookiestr = FormsAuthentication.Encrypt(tkt);

      ck = new HttpCookie(FormsAuthentication.FormsCookieName, cookiestr);

      if (chkPersistCookie.Checked)

      ck.Expires=tkt.Expiration;

    ck.Path = FormsAuthentication.FormsCookiePath;

      Response.Cookies.Add(ck);



      string strRedirect;

      strRedirect = Request["ReturnUrl"];

      if (strRedirect==null)

            strRedirect = "default.aspx";

         Response.Redirect(strRedirect, true);

   }

   else

      Response.Redirect("logon.aspx", true);

}




Los Espacios de Nombres que debemos agregar:

using System.Data.SqlClient;
using System.Web.Security;

Exportar los datos de un GridView de ASP.NET a Excel

<code>
Response.ClearContent();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.AddHeader("content-disposition", "attachment;filename=ArchivoExcel.xls");<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.Charset = "";<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.Cache.SetCacheability(HttpCacheability.NoCache);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.ContentType = "application/vnd.xls";<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.IO.StringWriter stringWrite = new System.IO.StringWriter();<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite);<br />
<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;GridServidores.RenderControl(htmlWrite);<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.Write(stringWrite.ToString());<br />
&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Response.End();
</code>



Para que esto funcione en la cabecera del Archivo .aspx

<code>
EnableEventValidation = "false"
</code>

sábado, 22 de octubre de 2011

Conexiones con ASP.net

aquí pueden encontrar las cadenass de conexión a cualquier servidor de bases de datos:

http://www.connectionstrings.com/


 
y más!!!

Cadena de conexión (C# y SQL Server)

Cadena de conexión con autenticación de Windows

Para conectar a una base de datos de SQL Server con autenticación de Windows, la cadena de conexión será:

Data Source = ServidorSQL; Initial Catalog = BaseDatos; Integrated Security = True

Cadena de conexión con autenticación de SQL Server

Para conectar a una base de datos de SQL Server usando autenticación del propio SQL Server, la cadena de conexión será:

data source = ServidorSQL; initial catalog = BaseDatos; 
user id = Usuario; password = Contraseña

viernes, 9 de septiembre de 2011

Hilos en c#

Crear un nuevo proyecto Aplicación de windows Form
Agregar dos Picturebox's: pictureBox1 y pictureBox2. Al final, debe verse así:




Debemos  hacer uso del espacio de nombres: "Threading"

using System.Threading;

Declaramos de manera Global los objetos p1 y p2 de la clase  Thread

Thread p1;
Thread p2;

Declaramos de manera Global también las Varialbles del tipo byte: r y g
 
byte r, g;

y del tipo bool las variables b1 y b2

 

Los metodos que pasaremos como parámetro a estos hilos serán:
Hilo1 ()
Hilo2 ()

 public void Hilo1() {

Doble click sobre el Formulario para programar en el evento Load del mismo:

   private void Form1_Load(object sender, EventArgs e)
        {
            r = 0; g = 255; b1 = false; b2 = true;
 
            p1 = new Thread(new ThreadStart(Hilo1));
            p2 = new Thread(new ThreadStart(Hilo2));
 
            p1.Start();
            p2.Start();
        }


El código debería quedar como el siguiente:

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        Thread p1;
        Thread p2;
 
        byte r, g;
        bool b1, b2;
       
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            r = 0; g = 255; b1 = false; b2 = true;
 
            p1 = new Thread(new ThreadStart(Hilo1));
            p2 = new Thread(new ThreadStart(Hilo2));
 
            p1.Start();
            p2.Start();
        }
       
        public void Hilo1() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (r >= 0 && r <= 255 && b1 == false)
                {
                    r++;
                    if (r == 255)
                        b1 = true;                   
                }
 
                if (r >= 0 && r <= 255 && b1 == true)
                {
                    r--;
                    if (r == 0)
                        b1 = false;
                }     
               
                pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
            }
       }
 
        public void Hilo2() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (g >= 0 && g <= 255 && b2 == false)
                {
                    g++;
 
                    if (g == 255)
                        b2 = true;
                }
 
                if (g >= 0 && g <= 255 && b2 == true)
                {
                    g--;
 
                    if (g == 0)
                        b2 = false;
                }     
               
                pictureBox2.BackColor = Color.FromArgb(100, g, 80); 
            }                  
        }
 
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            p1.Abort();
            p2.Abort();
        }
    }
}


Lo que se debe entender primero es que existen dos hilos: "p1" y "p2" (o dos objetos de la clase "Thread", en inglés "Hilo") cada uno asociado a un método:

A "p1" le corresponde "Hilo1"
y a "p2" le corresponde "Hilo2".

Lo que "p1" y "p2" permiten es que ambos métodos (Hilo1 e Hilo2) se ejecuten de manera simultánea.

Todas las otras variables en el programa son de control. Los hilos empiezan a ejecutarse al llamar al método "Start" y se terminan con "Abort". C# no permite llamar de nuevo a "Start" para un hilo que ya se está ejecutando.
Lo que hace el programa simplemente es variar el color de ambos PictureBoxes en un bucle que jamás termina, para ello se usa el comando

CualquierPictureBox.BackColor = Color.FromArgb(100, g, 80);

También uso el método Thread.Sleep que detiene la ejecución del hilo durante el tiempo en milisegundos que va entre paréntesis. Esto es para que los colores varíen despacio y se puedan apreciar.
Cada vez que dentro de un método se usa la palabra "Thread" ésta se refiere al hilo que está asociado a él.
            while (true)
            {
                Thread.Sleep(10);
 
                if (r >= 0 && r <= 255 && b1 == false)
                {
                    r++;
                    if (r == 255)
                        b1 = true;                   
                }
 
                if (r >= 0 && r <= 255 && b1 == true)
                {
                    r--;
                    if (r == 0)
                        b1 = false;
                }     
               
                pictureBox1.BackColor = Color.FromArgb(r, 80, 100);
            }
       }
 
        public void Hilo2() {
            while (true)
            {
                Thread.Sleep(10);
 
                if (g >= 0 && g <= 255 && b2 == false)
                {
                    g++;
 
                    if (g == 255)
                        b2 = true;
                }
 
                if (g >= 0 && g <= 255 && b2 == true)
                {
                    g--;
 
                    if (g == 0)
                        b2 = false;
                }     
               
                pictureBox2.BackColor = Color.FromArgb(100, g, 80); 
            }                  
        }
bool b1, b2;

martes, 26 de julio de 2011

Consumir un servicio web desde una aplicación WP7

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.ServiceModel;
using WindowsPhoneApplication6.ServiceReference1;

namespace WindowsPhoneApplication6
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            ServiceReference1.Service1SoapClient sw = new Service1SoapClient();
           //Manejador del evento que se desencadena cuando finaliza la ejecución del método del servicio            
           sw.HolaMundoCompleted += new EventHandler<HolaMundoCompletedEventArgs>(sw_HolaMundoCompleted);
        //invocamos el método            sw.HolaMundoAsync();
        }

        void sw_HolaMundoCompleted(object sender, HolaMundoCompletedEventArgs e)
        {
          txt_Resultado.Text=  e.Result;
        }
    }
}


video: http://vimeo.com/10987414

Comenzar a desarrollar Aplicaciones para Windows Phone

Para empezar a programar aplicaciones Windows Phone es necesario descargar las Windows Phone developer tools Con estas herramientas se puede desarrollar tanto para la versión 7 como para la versión 7.1 o Mango, que es la próxima actualización del sistema operativo.
La descarga incluye a parte de las herramientas para Windows Phone y el emulador, el SDK de Silverlight y DRT, el SDK de Expresion Blend y los WCF Data Services Client para Windows Phone 7.1.
En caso de no tener una versión de Visual Studio 2010 Profesional o superior se instalará Visual Studio 2010 Express para Windows Phone junto con los demás componentes.

Orientaciones de Pantalla en WP7

Windows Phone es compatible con las siguientes orientaciones de pantalla:
  • Portrait (Vertical)
  • Landscape left (Horizontal izquierda)
  • Landscape right (Horizontal derecha)
Los usuarios pueden simplemente girar el dispositivo para iniciar un cambio de una orientación a otra. Cuando se está probando tu aplicación en el emulador, se puede cambiar la orientación de la pantalla haciendo clic en los botones de la barra de herramientas del emulador. Los botones de orientación poseen rectángulos con flechas que indican el cambio de orientación.
clip_image002 
En la orientación vertical, la página está orientada verticalmente, de modo que la altura de la página sea mayor que su ancho.
En cualquiera de las dos orientaciones horizontales, la barra de estado y la barra de aplicaciones permanecen en el lado de la pantalla donde se encuentra el botón Inicio respectivamente.  El Landscape left tiene la barra de estado a la izquierda y el Landscape right tiene la barra de estado a la derecha. 
Portrait es la orientación por defecto para las aplicaciones y se debe agregar código adicional para soportar los Landscape. No se puede especificar solo la izquierda o solo la  derecha en orientación horizontal.   Si la orientación horizontal es soportada en tu aplicación debes soportar tanto la izquierda como la derecha.  Para especificar que tu aplicación es compatible con Portrait y Landscape debes establecer la propiedad SupportedOrientations a PortraitOrLandscape ya sea en el XAML o en el código.
Dejo el link de un video que muestra esto bien claro: http://www.youtube.com/watch?v=5LeOclVwNKc

Windows Phone 7

Navegar entre páginas por nuestras aplicaciones.

Imaginemos que tenemos dos páginas en nuestra aplicación, una que fuera la Pagina1.xaml y otra Pagina2.xaml. Si queremos ir de la primera a la segunda, podemos hacer uso de un

HyperlinkButton y de su evento click introduciendo  el siguiente código.

private void hyperlinkButton1_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri(Pagina2.xaml, UriKind.Relative));
        }
 
Para volver hacia atrás: podemos hacer uso del método GoBack incluido en la clase NavigationService y establecer un vínculo de vuelta a la primera página.

private void hyperlinkButton2_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.GoBack();
        }

martes, 24 de mayo de 2011

C# y Sql Server

Tabla

Una vez creada la tabla, en el Explorador de Objetos...




Click derecho en el Nombre de la Tabla

                                Incluir Tabla Como

                                                           Insert To

                                                                     Nueva Ventana del Editor de Consultas

Procedimiento Almacenado


Como vemos el nombre del procedimiento almacenado es Clientes_Insertar
 Recibe los siguientes parametros:

               @Apellido
                ,@Nombre
                ,@Direccion
                ,@Tel
                ,@Dni

y los inserta en los campos  (INSERT INTO T_Clientes)

          [Apellido]
           ,[Nombre]
           ,[Direccion]
           ,[Tel]
           ,[Dni]

 public void Insertar(string Apellido, string Nombre)
        {
            string servidor = @".\SQLEXPRESS";
            string BaseDeDatos = @"Base";

            SqlConnection Con = new SqlConnection("Data Source=" + servidor
                + "; initial catalog=" + BaseDeDatos + ";integrated security=true");

            SqlCommand com = new SqlCommand("Clientes_Insertar", Con);
            com.CommandType = CommandType.StoredProcedure;

            com.Parameters.Add(new SqlParameter("@Apellido", SqlDbType.VarChar));
            com.Parameters["@Apellido"].Direction = ParameterDirection.Input;
            com.Parameters["@Apellido"].Value = Apellido;

            com.Parameters.Add(new SqlParameter("@Nombre", SqlDbType.VarChar));
            com.Parameters["@Nombre"].Direction = ParameterDirection.Input;
            com.Parameters["@Nombre"].Value = Nombre;

            Con.Open();
            com.ExecuteNonQuery();
            Con.Close();
        }
 Se Crean dos Variables del tipo string

y se les asignan el nombre del servidor y de la base de Datos


string servidor = @".\SQLEXPRESS";
            string BaseDeDatos = @"Base";

Se Crea un Objeto SqlConnection llamado Con


            SqlConnection Con = new SqlConnection("Data Source=" + servidor
                + "; initial catalog=" + BaseDeDatos + ";integrated security=true");

Y se le pasa como parámetro la cadena de conexión

Creamos un objeto SqlCommand llamado com...
Este objeto recibe como parametros el nombre del procedimiento Clientes_Insertar  y la conexión que se usará


     SqlCommand com = new SqlCommand("Clientes_Insertar", Con);

La siguiente linea Especifica el tipo de Comando (En Este Caso StoredProcedure) o sea que buscara en la Base de Datos El Procedimiento Almacenado con el nombre Clientes_Insertar

            com.CommandType = CommandType.StoredProcedure;

Se Agregan Dos Parametros: @Apellido y @Nombre

Y estos Parametros reciben los valores de los parametros que recibe el método Apellido y Nombre

com.Parameters.Add(new SqlParameter("@Apellido", SqlDbType.VarChar));

Se Establece  La Dirección del Parametro en este Caso Input o sea Entrada

            com.Parameters["@Apellido"].Direction = ParameterDirection.Input;
 
Se Asigna El Valor de Apellido a @Apellido

            com.Parameters["@Apellido"].Value = Apellido;

            com.Parameters.Add(new SqlParameter("@Nombre", SqlDbType.VarChar));
            com.Parameters["@Nombre"].Direction = ParameterDirection.Input;
            com.Parameters["@Nombre"].Value = Nombre;

 Se Abre la Conexión

Con.Open();

Se Ejecuta el Comando

            com.ExecuteNonQuery();

Y Se Cierra La Conexión

            Con.Close();

martes, 10 de mayo de 2011

Consumir un Servicio Web Utilizando C#

Consumir un metodo del servicio Web, es como si llamaramos a un método de algun otro proyecto, pero con la diferencia que este método esta en un webService. Para poder usar los métodos de un WebService debemos agregar una referencia en el explorador de soluciones


Para comenzar vamos a crear nuestro Servicio Web

En el Menú Archivo
Nuevo
Proyecto
 Seleccionar la Opción Web
y Aplicación de Servicio Web de ASP.NET


 

Ahora en El archivo Service1.asmx.cs

tenemos un Método que se llama HelloWorld


[WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

Como podemos ver antes del Método tenemos la instrucción: [WebMethod]

esta nos dice que el método será accesible desde el cliente

Vamos a utilizar este simple método para probar el uso del servicio.

Ejecutamos F5
y se abre una ventana del navegador Copiar la dirección

por ej: http://localhost:1 tatata 9/Service1.asmx


 Ahora volvemos al Visual Estudio

Vamos a Crear un nuevo Proyecto

Archivo
Nuevo
Proyecto: Aplicación de Windows Form

Agregamos un boton al formulario


y hacemos click derecho en el nombre del proyecto
Seleccionamos la Opción

Agregar Referencia Web


o Agregar Referencia de Servicio en Visual Estudio 2010


pegamos esa Dirección 
justamente donde dice: Dirección     
Aceptamos

y tenemos que agregar:

using Nombre_Del_Proyecto.Nombre_De_La_Referencia

using WindowsApplicationX.ServiceReference1

Luego tenemos que instanciar el servicio
y listo ya podemos hacer uso de los métodos dentro de este!!!!



Como vieron consumir un WebService no es díficil, solo hay que conocer los pasos y listo, un Servicio web también se puede consumir desde una aplicación Web, desde una aplicación móvil, y desde cualquier dispositivo que tenga salida a internet