Pop

32.Aplicaciones web.Página de Login (1).Curso de C# con Visual Studio 2017.

32- . Aplicaciones web.Página de Login (1)

   - En este capítulo del curso de programación en c# con visual studio 2017 vamos a ver como crear un página de Login que valida contra una base de datos SQL Server. En el caso, que el usuario que esta intentado entrar en el sitio web exista en el sistema le dejara ingresar, si no lanzaremos un error de autenticación.

- Para validar que el usuario existe, buscamos en la base datos via procedimiento almacenado el valor que usuario introduza en el campo usuario (en nuestro caso el email). Si encontramos el email en nuestro sistema devolvemos a la aplicación el email y la password cifrada asociada que tiene, si no le encontramos lanzamos un error que mostraremos por pantalla.
- Una vez que tenemos la password y el usuario comprobamos que la password almacenada coincide con la que usuario introduzca. En el video siguiente lo veréis con más claridad:



* Os dejo el código del ejempo visto en el video:

  • Página de default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="GestionVarios.Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <table width="200" border="0" cellspacing="0" cellpadding="0">
                          <tr>
                            <td height="24">
                              <table width="200" border="0" cellspacing="0" cellpadding="0">
                                <tr>
                                  <td width="75" align="right" valign="top">
                                    Usuario:&nbsp;&nbsp;&nbsp;&nbsp;
                                  </td>
                                  <td width="125">
                                    <asp:TextBox ID="txtUsuario" runat="server" ></asp:TextBox>
                                    <asp:RegularExpressionValidator ID="mvalUsuarioValida" runat="server"
                                          ErrorMessage="Usuario incorrecto" ControlToValidate="txtUsuario"
                                          ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic" ForeColor="Red" ></asp:RegularExpressionValidator>
                                    <asp:RequiredFieldValidator ID="mvalRequiereUsuario" runat="server" ErrorMessage="<br>Indique el usuario" ControlToValidate="txtUsuario" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                                  </td>
                                </tr>
                              </table>
                            </td>
                          </tr>
                          <tr>
                            <td height="24">
                              <table width="200" border="0" cellspacing="0" cellpadding="0">
                                <tr>
                                  <td width="75" align="right" valign="top" class="texto_news">
                                    Password:&nbsp;
                                  </td>
                                  <td width="125">
                                    <asp:TextBox ID="txtPassword" runat="server" TextMode="Password" ></asp:TextBox>
                                    <asp:RegularExpressionValidator ID="mvalPasswordValida" runat="server" ErrorMessage="<br>Contraseña incorrecta" ControlToValidate="txtPassword" ValidationExpression="\w+.{5,}" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
                                    <asp:RequiredFieldValidator ID="mvalRequiereContraseña" runat="server" ErrorMessage="<br>Indique la contraseña" ControlToValidate="txtPassword" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                                  </td>
                                </tr>
                              </table>
                            </td>
                          </tr>
                          <tr>
                            <td align="right" valign="middle">
                                <asp:Button runat="server" Text="Inicio sesion" OnClick="Unnamed1_Click" />
                                <br />
                                <asp:Label runat="server" ID="lblError"></asp:Label>
                            </td>
                          </tr>
                          
                          <tr>
                            <td>
                              <table width="200" border="0" cellspacing="0" cellpadding="0">
                                 <tr>
                                  <td height="22" align="left"><a href="~/AltaUsuario.aspx" runat="server"  target="_blank"><b>Darse de alta </b></a></td>
                                </tr>
                                <tr>
                                  <td align="left">
                                    <asp:LinkButton ID="lnkOlvido" runat="server"
                                     CausesValidation="false" OnClick="lnkOlvido_Click"><b>¿Olvidó su password?</b></asp:LinkButton>
                                  </td>
                                </tr>
                              </table>
                            </td>
                          </tr>
                        </table>
        </div>
    </form>
</body>
</html>

  • Página de default.aspx.cs:
 using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Unnamed1_Click(object sender, EventArgs e)
        {
          
            SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
            string usuarioGuardadaBaseDatos  = String.Empty;
            byte[] passGuardadaBaseDatos = null;
            try
            {
                conexion.Open();
                SqlCommand com = conexion.CreateCommand();
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.CommandText = "dbo.ValidarUsuario";
               com.Parameters.Add("@email", SqlDbType.VarChar, 255).Value = txtUsuario.Text;

                SqlDataReader reader = com.ExecuteReader();

                if (reader.Read())
                {
                    usuarioGuardadaBaseDatos = reader["email"].ToString();
                    if(usuarioGuardadaBaseDatos!=String.Empty)
                    passGuardadaBaseDatos = (byte[])reader["pass"];
                 
                }
                else
                    throw new Exception("Usuario o pass incorrecto.");

                if(usuarioGuardadaBaseDatos!=String.Empty && ValidarDatos(usuarioGuardadaBaseDatos, passGuardadaBaseDatos))
                {
                    Response.Redirect("~/Pedidos.aspx");
                    Response.End();
               }
                else
                    throw new Exception("Usuario o pass incorrecto.");

            }
            catch (Exception ex)
            {
                lblError.Text = "Se produjo un error iniciando sesion:" + ex.Message;
                lblError.ForeColor = Color.Red;
            
            }
            finally
            {
                if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
                    conexion.Close();

                conexion.Dispose();
            }

         
        }

        private Boolean ValidarDatos(string usuario, byte[] pass)
        {
            Boolean usuarioCorrecto = false;
            string passDescifrada = String.Empty;

            String miclave = ConfigurationManager.AppSettings["clave"];
            byte[] claveCifrado = System.Text.Encoding.ASCII.GetBytes(miclave);
            Cifrado c = new Cifrado(claveCifrado);
            passDescifrada = c.descifrar(pass);

     
            if (passDescifrada == txtPassword.Text && txtUsuario.Text == usuario)
                usuarioCorrecto = true;

            return usuarioCorrecto;
        }

        protected void lnkOlvido_Click(object sender, EventArgs e)
        {

        }

  
    }
}

  • Clase cifrado.cs:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web;

namespace GestionVarios
{
    public class Cifrado
    {
        Aes miAes = null;

        public Cifrado(byte[] clave)
        {
            miAes = Aes.Create();
            miAes.Key = clave;
            miAes.IV = clave;
        }

        public byte[] cifrar(string original)
        {
            byte[] encrypted = EncriptarStringToBytesAes(original, miAes.Key, miAes.IV);
            return encrypted;
        }

        public string descifrar(byte[] encrypted)
        {
            string roundtrip = DesencriptarStringFromBytesAes(encrypted, miAes.Key, miAes.IV);
            return roundtrip;

        }

        private byte[] EncriptarStringToBytesAes(string cadena, byte[] clave, byte[] IV)
        {

            if (cadena == null || cadena.Length <= 0)
                throw new ArgumentNullException("plainText");

            if (clave == null || clave.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

           using (Aes aesAlg = Aes.Create())
           {
                aesAlg.Key = clave;
                aesAlg.IV = IV;
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(cadena);

                        }
                        encrypted = msEncrypt.ToArray();
                    }

                }

            }
            return encrypted;
        }

        private string DesencriptarStringFromBytesAes(byte[] textoCifrado, byte[] clave, byte[] IV)
        {
            if (textoCifrado == null || textoCifrado.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (clave == null || clave.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");
            string plaintext = null;

            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = clave;
                aesAlg.IV = IV;

                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
             
                using (MemoryStream msDecrypt = new MemoryStream(textoCifrado))
                {

                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                          plaintext = srDecrypt.ReadToEnd();

                        }
                    }

                }
            }
            return plaintext;
        }

    }
} 

31.Aplicaciones web.HiddenField y Fileupload.Curso de C# con Visual Studio 2017.

31-.Aplicaciones web.HiddenField y Fileupload

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a ver dos controles de uso común en muchas de las páginas web que utilizamos habitualmente.Vamos con una breves definiciones de ellos:
  • FileUpload: Es un control que permite subir ficheros desde nuestros equipos a los servidores. Se compone de un  cuadro de texto y un botón Examinar que permiten a los usuarios seleccionar un archivo para cargarlo al servidor.
  • HiddenField: El control HiddenField constituye un medio para almacenar información en la página sin mostrarla. Para incluir información en un control HiddenField, hay que establecer su propiedad Vallue con el valor que desea almacenar.
    Al igual que cualquier otro control de servidor Web, la información incluida en un control HiddenField está disponible durante la devolución de datos. La información no se conserva fuera de la página.

    - En el video os muestro un ejemplo de uso de estos dos controles:


    - Para completar la información mostrada en el vídeo sobre los dos controles con los que estamos trabajando os dejo los enlaces a páginas de Microsoft:

    1. HiddenField:https://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.hiddenfield(v=vs.100).aspx 
    2. FileUpload:https://msdn.microsoft.com/es-es/library/system.web.ui.webcontrols.fileupload(v=vs.110).aspx
    - También os dejo el código de los ejemplos vistos en el video:
    * Página aspx:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EjemploControlesVarios.aspx.cs" Inherits="GestionVarios.EjemploControlesVarios" %>

    <!DOCTYPE html>

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
            <div>
                <asp:Calendar ID="Calendar1" runat="server" ></asp:Calendar>
                <asp:Label runat="server" ID="lblMostrar"></asp:Label>
                <asp:Button runat="server" ID="btnClic" Text="Dale" OnClick="btnClic_Click" />
                <br />
                <br />
                <asp:FileUpload ID="fileUpload" runat="server" />
                <asp:Button ID="btnFileUploada" runat="server" Text="Guardar" OnClick="btnFileUploada_Click" />
                  <asp:Label runat="server" ID="lblFileupload"></asp:Label>
                <asp:HiddenField ID="HiddenField1" runat="server" />
            </div>
        </form>
    </body>
    </html> 

    *Fichero .cs asosciado a la página aspx:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;

    namespace GestionVarios
    {
        public partial class EjemploControlesVarios : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!Page.IsPostBack)
                {
                Calendar1.SelectedDate = DateTime.Now;
                lblMostrar.Text = Calendar1.SelectedDate.ToShortDateString();
            }
            }

            protected void btnClic_Click(object sender, EventArgs e)
            {
                if (Calendar1.SelectedDate < DateTime.Now)
                    lblMostrar.Text = "No puede seleccionar una fecha anterior a hoy";
                else
                    lblMostrar.Text = "OK";
            }

            protected void btnFileUploada_Click(object sender, EventArgs e)
            {
                if (fileUpload.PostedFile.FileName == String.Empty)
                    lblFileupload.Text = "Seleccione un fichero";
                else
                    HiddenField1.Value = fileUpload.PostedFile.FileName;
            }
        }
    }


     

30.Aplicaciones web.Objeto Calendar.Curso de C# con Visual Studio 2017.

30-.Aplicaciones web.Objeto Calendar

   - En este capítulo del curso de programación en c# con visual studio 2017,vamos a ver un control de uso común en muchas de las páginas web que utilizamos habitualmente. Este control es el Calendar, que  permite a un usuario seleccionar una fecha mediante un calendario visual.

- El control Calendar muestra un calendario en el que los usuarios pueden desplazarse a cualquier día de cualquier año. Cuando se ejecuta la página ASP.NET, el control Calendar se representa como una tabla HTML. En consecuencia, ciertas propiedades del control corresponden a varios aspectos del formato de la tabla.


- En el video os he mostrado un ejemplo sobre como utilizar este control y algunas de las propiedades que tiene. Os dejo un enlace para completar la información: https://msdn.microsoft.com/es-es/library/system.windows.controls.calendar(v=vs.110).aspx

- Os dejo también el código del ejemplo de uso del control calendario.

  • Código del fichero aspx: 
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="EjemploControlesVarios.aspx.cs" Inherits="GestionVarios.EjemploControlesVarios" %>

<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Calendar ID="Calendar1" runat="server" ></asp:Calendar>
            <asp:Label runat="server" ID="lblMostrar"></asp:Label>
            <asp:Button runat="server" ID="btnClic" Text="Dale" OnClick="btnClic_Click" />
        </div>
    </form>
</body>
</html>

  • Código del fichero cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class EjemploControlesVarios : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
            Calendar1.SelectedDate = DateTime.Now;
            lblMostrar.Text = Calendar1.SelectedDate.ToShortDateString();
        }
        }

        protected void btnClic_Click(object sender, EventArgs e)
        {
            if (Calendar1.SelectedDate < DateTime.Now)
                lblMostrar.Text = "No puede seleccionar una fecha anterior a hoy";
            else
                lblMostrar.Text = "OK";
        }
}
}

29.Aplicaciones web.Encriptando password.Curso de C# con Visual Studio 2017.

29-.Aplicaciones web.Encriptando password

   - En este capítulo del curso de programación en c# con visual studio 2017 aprenderemos a encriptar password utlilizando el espacion de nombres System.Security.Cryptography disponible en los frameworks de .net.

- El espacio de nombres  System.Security.Cryptography proporciona servicios criptográficos, incluidas la codificación y descodificación segura de datos, así como muchas otras operaciones, como cálculos hash, generación de números aleatorios y la autenticación de mensajes.

- Una vez tengamos la contraseña cifrada la guardamos en la base de datos mediante una llamada a un procedimiento almacenado. En el video tenéis todo el proceso, tanto el cifrado como la llamada al procedimiento almacenado para guardar en base de datos.


- Os dejo unos enlaces a páginas donde podéis completar información sonre este tema:

  1. https://msdn.microsoft.com/es-es/library/system.security.cryptography(v=vs.110).aspx
  2. https://msdn.microsoft.com/es-es/library/system.security.cryptography.aes(v=vs.110).aspx
  3. https://msdn.microsoft.com/es-es/library/92f9ye3s(v=vs.110).aspx

- Como acostumbro os dejo también el código visto en el ejemplo:


  •  Clase que utilizo para el cifrado/encriptación:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Web;

namespace GestionVarios
{
    public class Cifrado
    {
        Aes miAes = null;

        public Cifrado(byte[] clave)
        {
            miAes = Aes.Create();
            miAes.Key = clave;
        }

        public byte[] cifrar(string original)
        {
            byte[] encrypted = EncriptarStringToBytesAes(original, miAes.Key, miAes.IV);
            return encrypted;
        }

        public string descifrar(byte[] encrypted)
        {
            string roundtrip = DesencriptarStringFromBytesAes(encrypted, miAes.Key, miAes.IV);
            return roundtrip;

        }

        private byte[] EncriptarStringToBytesAes(string cadena, byte[] clave, byte[] IV)
        {

            if (cadena == null || cadena.Length <= 0)
                throw new ArgumentNullException("plainText");

            if (clave == null || clave.Length <= 0)
                throw new ArgumentNullException("Key");

            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");

            byte[] encrypted;

           using (Aes aesAlg = Aes.Create())
           {
                aesAlg.Key = clave;
                aesAlg.IV = IV;
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

                using (MemoryStream msEncrypt = new MemoryStream())
                {
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {
                            swEncrypt.Write(cadena);

                        }
                        encrypted = msEncrypt.ToArray();
                    }

                }

            }
            return encrypted;
        }

        private string DesencriptarStringFromBytesAes(byte[] textoCifrado, byte[] clave, byte[] IV)
        {
            if (textoCifrado == null || textoCifrado.Length <= 0)
                throw new ArgumentNullException("cipherText");
            if (clave == null || clave.Length <= 0)
                throw new ArgumentNullException("Key");
            if (IV == null || IV.Length <= 0)
                throw new ArgumentNullException("IV");
            string plaintext = null;

            using (Aes aesAlg = Aes.Create())
            {
                aesAlg.Key = clave;
                aesAlg.IV = IV;

                ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
             
                using (MemoryStream msDecrypt = new MemoryStream(textoCifrado))
                {

                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                        {
                          plaintext = srDecrypt.ReadToEnd();

                        }
                    }

                }
            }
            return plaintext;
        }

    }
}


  • aspx de alta de usuario:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AltaUsuario.aspx.cs" Inherits="GestionVarios.AltaUsuario" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

        <table width="700px" border="0" cellpadding="0" cellspacing="0" align="center">
            <tr>
                <td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="left">
                    <h1>Datos de acceso</h1>
                <br />
                </td>
            </tr>

            <tr>
                 <td width="250px" height="22px" align="left" style="vertical-align: top">Nombre usuario:</td>
                 <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="txtnombre" runat="server" Width="300px"  ForeColor="Black" ></asp:TextBox>
                    <asp:RequiredFieldValidator ID="reqNombre" runat="server" ControlToValidate="txtnombre" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                 </td>

            </tr>
                 <tr>
                 <td width="250px" height="22px" align="left" style="vertical-align: top">Pais:</td>
                 <td width="450px" align="left" style="vertical-align: top">
                    <asp:DropDownList runat="server" id="cmbPaises" AppendDataBoundItems="True" Width="311px" DataSourceID="SqlDataSource1" DataTextField="Pais" DataValueField="CodPais">
                        <asp:ListItem Text="Seleccione un pais" Value="-1">-SELECCIONAR-</asp:ListItem>
                         </asp:DropDownList>
                     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePaises" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
                <asp:RequiredFieldValidator id="reqPais"  ControlToValidate="cmbPaises" ErrorMessage="* Seleccione pais"   Display="Dynamic" InitialValue="-1" runat="server" ForeColor="Red" />
                 </td>

            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Dirección de E-Mail:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtEMail" runat="server" Width="300px"  ForeColor="Black" ></asp:TextBox>
                    <asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                    <asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="La Dirección de E-Mail especificada no es válida.<br>" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic"  ForeColor="Red"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Contraseña:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtPassword" runat="server" Width="150px" MaxLength="20" TextMode="Password"></asp:TextBox>
                    <br />
                    <asp:RequiredFieldValidator ID="mreqPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="Debe especificar una contraseña de al menos 6 caracteres.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="mregPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="La contraseña no es correcta (min. 6 cars)." ValidationExpression="\w+.{5,}" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Confirmar Contraseña:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtPassword2" runat="server" Width="150px" MaxLength="20" TextMode="Password"  ></asp:TextBox>
                   <br />
                    <asp:RequiredFieldValidator ID="mreqPassword2" runat="server" ControlToValidate="mtxtPassword2" ErrorMessage="Debe confirmar la contraseña.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                    <asp:CompareValidator ID="mcomPasswords" runat="server" ErrorMessage="Las contraseñas no son iguales." Display="Dynamic" ControlToCompare="mtxtPassword" ControlToValidate="mtxtPassword2" ForeColor="Red"></asp:CompareValidator>
                </td>
            </tr>
               <tr>
                   <td>&nbsp;</td>
                <td width="250px" height="22px" align="left" style="vertical-align: top">
                    <asp:CheckBox ID="chkCondiciones" runat="server"/><asp:HyperLink ID="linkCondiciones" runat="server" Text="Condiciones servicio" NavigateUrl="~/CondicionesServicio.aspx"></asp:HyperLink><br />
                </td>
                </tr>     
            <tr>
                <td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="center" colspan="2">
                    <asp:Button ID="mbtnRegistrar" runat="server" Text="ALTA" OnClick="mbtnRegistrar_Click" />
                       <asp:Label runat="server" ID="lblError" Visible="false" ForeColor="Red"></asp:Label>
                </td>
            </tr>
          
        </table>
    </form>
</body>
</html>



  • fichero cs del alta de cliente:
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class AltaUsuario : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void mbtnRegistrar_Click(object sender, EventArgs e)
        {
            lblError.Visible = true;
            if (chkCondiciones.Checked == false)
            {
                
                lblError.Text = "Debes aceptar los términos y condiciones del servicio.";
            }
            else
            {
                byte[] passCifrada = cifrar(mtxtPassword.Text.Trim());
                if (guardarUsuario(passCifrada))
                {
                    lblError.Text = "Usuario dado de alta correctamente";
                    lblError.ForeColor = Color.Green;
                }

            }
        }

        private Boolean guardarUsuario(byte[] passCifrada)
        {
            Boolean todoOk = true;
            SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
            try
            {
                conexion.Open();
                SqlCommand com = conexion.CreateCommand();
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.CommandText = "dbo.AltaUsuario";
                com.Parameters.Add("@nombre",SqlDbType.VarChar,255).Value=txtnombre.Text;
                com.Parameters.Add("@email", SqlDbType.VarChar, 255).Value = mtxtEMail.Text;
                com.Parameters.Add("@pass", SqlDbType.VarBinary, 8000).Value = passCifrada;
                com.Parameters.Add("@codPais", SqlDbType.VarChar, 3).Value = cmbPaises.SelectedValue;

                com.ExecuteNonQuery();

            
            }
            catch (Exception ex)
            {
                lblError.Text = "Se produjo un error guardando el usuario." + ex.Message;
                lblError.ForeColor = Color.Red;
                todoOk = false;
            }
            finally
            {
                if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
                    conexion.Close();

                conexion.Dispose();
            }

            return todoOk;
        }

        private byte[] cifrar(string cadenaAcifrar)
        {
            String miclave = ConfigurationManager.AppSettings["clave"];
            byte[] claveCifrado = System.Text.Encoding.ASCII.GetBytes(miclave);
            Cifrado c = new Cifrado(claveCifrado);
            byte[] b = c.cifrar(cadenaAcifrar);
            return b;
        }



    }
}

28.Aplicaciones web.SQL parte 2.Curso de C# con Visual Studio 2017.

28- . Aplicaciones web.Llamando a BDDD desde la aplicación

   - En este capítulo del curso de programación en c# con visual studio 2017,continuamos con un poco de SQL SERVER. Para ello debéis tener instalado SQL Express.En la anterior entrada del blog os deje un enlace para que lo pudierais descargar e instalar.

- En este capítulo conectamos nuestra página de alta de usuario a nuestra base de datos SQL via procedimientos almacenado. Para ello necesitamos establecer una cadena de conexión, que podemos inicializar en el web.config, que es el archivo principal de opciones de configuración para una aplicación web hecha en asp.net. El archivo es un documento que define información de configuración concerniente a la aplicación web. El archivo web.config contiene información que controla la carga de módulos, configuraciones de seguridad, configuraciones del estado de la sesión, opciones de compilación y el lenguaje de la aplicación. Los archivos web.config pueden contener también objetos específicos tales como cadenas de conexión.En nuestro caso la cadena de conexión va con autenticación windows  en vez de con usuario y password :

  <connectionStrings>
    <add name="EmpresaConnectionString" connectionString="Data Source=LAPTOP-C3OQ67NM\SQLEXPRESS;Initial Catalog=Empresa;Integrated Security=True"
      providerName="System.Data.SqlClient" />
  </connectionStrings>




- Una vez que tenemos inicializada la cadena de conexión, la utilizamos para cargar el combo con los paises via procedimiento almacenado  y para guardar los datos de un usuario que utilice el formulario de alta. Los procedimientos almacenados que llamamos desde el código son los siguientes:

  • El procedimiento que nos devuelve los paises es el siguiente: 
ALTER PROCEDURE [dbo].[DamePaises]
   
AS
BEGIN

    SET NOCOUNT ON;
   
    SELECT Pais,CodPais FROM Paises order by 2 asc

END


  •  El procedimiento almacenado que se encarga de guardar el usuario es este:
ALTER PROCEDURE [dbo].[AltaUsuario]
    @nombre varchar(255),
    @email varchar(255),
    @pass varbinary(MAX)=NULL,
    @codPais varchar(3)
AS
BEGIN

    SET NOCOUNT ON;

    DECLARE @idpais int

    SELECT @idpais=idPais FROM Paises WHERE CodPais = @codPais

    INSERT INTO dbo.Usuarios(Nombre,Email,Pass,IdPais) VALUES
   (@nombre,@email,@pass,@idpais)

END 


- Una vez que tenenos definidos los procedimientos almacenados que vamos a utlizar ya los podemos llamar desde nuestra aplicación cliente.Os dejo el código de la aplicación:

  •  Código de la página de AltaUsuario.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AltaUsuario.aspx.cs" Inherits="GestionVarios.AltaUsuario" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

        <table width="700px" border="0" cellpadding="0" cellspacing="0" align="center">
            <tr>
                <td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="left">
                    <h1>Datos de acceso</h1>
                <br />
                </td>
            </tr>

            <tr>
                 <td width="250px" height="22px" align="left" style="vertical-align: top">Nombre usuario:</td>
                 <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="txtnombre" runat="server" Width="300px"  ForeColor="Black" ></asp:TextBox>
                    <asp:RequiredFieldValidator ID="reqNombre" runat="server" ControlToValidate="txtnombre" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                 </td>

            </tr>
                 <tr>
                 <td width="250px" height="22px" align="left" style="vertical-align: top">Pais:</td>
                 <td width="450px" align="left" style="vertical-align: top">
                    <asp:DropDownList runat="server" id="cmbPaises" AppendDataBoundItems="True" Width="311px" DataSourceID="SqlDataSource1" DataTextField="Pais" DataValueField="CodPais">
                        <asp:ListItem Text="Seleccione un pais" Value="-1">-SELECCIONAR-</asp:ListItem>
                            <asp:ListItem Text="España" Value="1"></asp:ListItem>
                            <asp:ListItem Text="Portugal" Value="2"></asp:ListItem>
                            <asp:ListItem Text="Francia" Value="3"></asp:ListItem>
                            <asp:ListItem Text="Italia" Value="4"></asp:ListItem>
                 </asp:DropDownList>
                     <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:EmpresaConnectionString %>" SelectCommand="DamePaises" SelectCommandType="StoredProcedure"></asp:SqlDataSource>
                <asp:RequiredFieldValidator id="reqPais"  ControlToValidate="cmbPaises" ErrorMessage="* Seleccione pais"   Display="Dynamic" InitialValue="-1" runat="server" ForeColor="Red" />
                 </td>

            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Dirección de E-Mail:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtEMail" runat="server" Width="300px"  ForeColor="Black" ></asp:TextBox>
                    <asp:RequiredFieldValidator ID="mreqEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="*" Display="Dynamic" ForeColor="Red"  ></asp:RequiredFieldValidator><br />
                    <asp:RegularExpressionValidator ID="mregEMail" runat="server" ControlToValidate="mtxtEMail" ErrorMessage="La Dirección de E-Mail especificada no es válida.<br>" ValidationExpression="\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*" Display="Dynamic"  ForeColor="Red"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Contraseña:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtPassword" runat="server" Width="150px" MaxLength="20" TextMode="Password"></asp:TextBox>
                    <br />
                    <asp:RequiredFieldValidator ID="mreqPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="Debe especificar una contraseña de al menos 6 caracteres.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                    <asp:RegularExpressionValidator ID="mregPassword" runat="server" ControlToValidate="mtxtPassword" ErrorMessage="La contraseña no es correcta (min. 6 cars)." ValidationExpression="\w+.{5,}" Display="Dynamic" ForeColor="Red"></asp:RegularExpressionValidator>
                </td>
            </tr>
            <tr>
                <td width="250px" height="22px" align="left" style="vertical-align: top">Confirmar Contraseña:
                </td>
                <td width="450px" align="left" style="vertical-align: top">
                    <asp:TextBox ID="mtxtPassword2" runat="server" Width="150px" MaxLength="20" TextMode="Password"  ></asp:TextBox>
                   <br />
                    <asp:RequiredFieldValidator ID="mreqPassword2" runat="server" ControlToValidate="mtxtPassword2" ErrorMessage="Debe confirmar la contraseña.<br>" Display="Dynamic" ForeColor="Red"></asp:RequiredFieldValidator>
                    <asp:CompareValidator ID="mcomPasswords" runat="server" ErrorMessage="Las contraseñas no son iguales." Display="Dynamic" ControlToCompare="mtxtPassword" ControlToValidate="mtxtPassword2" ForeColor="Red"></asp:CompareValidator>
                </td>
            </tr>
               <tr>
                   <td>&nbsp;</td>
                <td width="250px" height="22px" align="left" style="vertical-align: top">
                    <asp:CheckBox ID="chkCondiciones" runat="server"/><asp:HyperLink ID="linkCondiciones" runat="server" Text="Condiciones servicio" NavigateUrl="~/CondicionesServicio.aspx"></asp:HyperLink><br />
                </td>
                </tr>     
            <tr>
                <td width="700px" style="height: 40px; vertical-align: middle;" colspan="2" align="center" colspan="2">
                    <asp:Button ID="mbtnRegistrar" runat="server" Text="ALTA" OnClick="mbtnRegistrar_Click" />
                       <asp:Label runat="server" ID="lblError" Visible="false" ForeColor="Red"></asp:Label>
                </td>
            </tr>
          
        </table>
    </form>
</body>
</html>


  • Cdigo del fichero cs asociado: ´
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace GestionVarios
{
    public partial class AltaUsuario : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void mbtnRegistrar_Click(object sender, EventArgs e)
        {
            lblError.Visible = true;
            if (chkCondiciones.Checked == false)
            {
              
                lblError.Text = "Debes aceptar los términos y condiciones del servicio.";
            }
            else
            {
                guardarUsuario();
                lblError.Text = "Usuario dado de alta correctamente";
                lblError.ForeColor = Color.Green;

            }
        }

        private void guardarUsuario()
        {
            SqlConnection conexion = new SqlConnection(ConfigurationManager.ConnectionStrings["EmpresaConnectionString"].ConnectionString);
            try
            {
                conexion.Open();
                SqlCommand com = conexion.CreateCommand();
                com.CommandType = System.Data.CommandType.StoredProcedure;
                com.CommandText = "dbo.AltaUsuario";
                com.Parameters.Add("@nombre",SqlDbType.VarChar,255).Value=txtnombre.Text;
                com.Parameters.Add("@email", SqlDbType.VarChar, 255).Value = mtxtEMail.Text;
                // com.Parameters.Add("@pass", SqlDbType.VarBinary, 8000).Value = mtxtEMail.Text;
                com.Parameters.Add("@codPais", SqlDbType.VarChar, 3).Value = cmbPaises.SelectedValue;

                com.ExecuteNonQuery();

            
            }
            catch (Exception ex)
            {
                lblError.Text = "Se produjo un error guardando el usuario:" + ex.Message;
            }
            finally
            {
                if (conexion != null && conexion.State == System.Data.ConnectionState.Open)
                    conexion.Close();

                conexion.Dispose();
            }
        }
    }
}



 





Curso .NET Core en C# - 34.Creamos nuestro propio log

34.Creamos nuestro propio log Hola a todos. En este curso, analizaremos todos los conceptos básicos, intermedios y avanzados de  ASP.NET...