none
Error con pagina web con variable de sesion RRS feed

  • Pregunta

  • Hola amigos 

    acabo de tener un problema con mi sistema web, veran he hecho un login que tiene variables de sesion, lo que yo quiero es que en un label me muestre el nombre de usuario que se a loguedo en el sistema tengo este codigo

     protected void Page_Load(object sender, EventArgs e)
            {
                //Desabilitar la cache para no retorceder en el navegador
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
    
                lblNombreAdministrador.Text = "Hola, " + Session["Usuario"];
            }
    
            protected void imbCerrarSesion_Click(object sender, ImageClickEventArgs e)
            {
                Session["Autenticacion"] = false;
                Response.Redirect("~/IniciarSesion.aspx");
            }

    pero cuando compilo el sistema me da este error

    segun lo que investigue es un codigo que me falta en el web.config el cual me queda asi

    <authentication mode="Forms">
        <forms loginUrl="~/IniciarSesion.aspx" timeout="2880">
        </forms>
      </authentication>

    pero cuando coloco este codigo me da este error

    no se como solucionar este error de antemano muchas gracias

    miércoles, 19 de noviembre de 2014 21:05

Respuestas

  • hola

    pero alli lo que menciona es que estas teniendo un problema en el web.config

    authentication Element (ASP.NET Settings Schema)

    ubicas ese tag dentro del <system.web> ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:31
    viernes, 21 de noviembre de 2014 13:54
  • Si le parece bien podemos trabajar sobre este modelo

    Implementar la autenticación por Formularios, hacer el sitio privado al ingreso al mismo, pero dejamos una puerta abierta a los visitantes que quieren navegar la carpeta publica, en la raíz un página de bienvenida la cual mostrara el usuario autenticado



    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:25
    viernes, 21 de noviembre de 2014 14:29
  • Correcto

    El siguiente paso entonces agregamos los controles a la pagina de Login

    <body>
        <form id="form1" runat="server">
        <div>
        <h2>Login</h2>
            <table>
                <tr>
                    <td>Usuario</td>
                    <td>
                        <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox></td>
                    <td></td>
                </tr>
                <tr>
                    <td>password</td>
                    <td>
                        <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Recordarme?</td>
                    <td>
                        <asp:CheckBox ID="chcRememberme" runat="server" />   
                    </td>
                    <td></td>
                </tr>
                  <tr>
                    <td>
                        &nbsp;</td>
                    <td>
                        <asp:Button ID="btnLogin" runat="server" Text="Ingresar" />
                    </td>
                    <td></td>
                </tr>
            </table>
        </div>
            <asp:Label ID="lblResults" runat="server" style="color: #FF0000" ></asp:Label>
        </form>
    </body>

    Voy a pasar por alto los validadores nos remitimos a lo mas basico y funcional posible su usted quiere profundizar en algun paso basta que lo mencione


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:25
    viernes, 21 de noviembre de 2014 15:08
  • Excelente, disculpas si en momentos demoro un poco, estoy alternando entre algunos menesteres y usted

    Seguimos entonces

    Ahora como dijimos antes vamos a restringir la entrada al sitio y establecer la Pagina de Login, eso lo hacemos agregando lo siguiente en el web config

    <?xml version="1.0"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.0" />
    
      <authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="Bienvenida.aspx"></forms>  
    </authentication>
    
      <authorization>
      <deny users="?"/>
    </authorization>  
    
        </system.web>
    </configuration>
    

    Login Url es cuando un visitante quiera ingresar a alguna zona protegida entonces lo enviara a esta pagina solicitando las credenciales

    default Url: una vez autenticado el usuario deberemos dirigirlo a algun lado, si como veremos mas adelante el usuario no tiene un histórico de navegacion entonces sera redirigido a esta pagina

    deny users="?" esta linea indica que solo usuarios autenticados pueden ver el contenido del sitio

    ya que conocemos esto falta codificar el boton login para que autentique el usuario



    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 15:41
  • Preparemos la pagina de bienvenida

    Siguiendo en la modalidad basica solo agregaremos un label

    Aqui el código de la página por si gusta implementar como test

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Bienvenida.aspx.cs" Inherits="WebMSDNBasicAuth.Bienvenida" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
         <h1>Bienvenido</h1>
          Nombre de usuario: <asp:Label ID="label1" runat="server"></asp:Label>  
        </div>
        </form>
    </body>
    </html>

    Y en el código de servidor de la pagina por ahora quedara asi

      protected void Page_Load(object sender, EventArgs e)
            {
                label1.Text = User.Identity.Name;
            }

    Por obvias razones todavia no podremos ver la página

    pero ya vamos por buen camino


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 15:51
  • Siguiendo con nuestra meta ahora vamos a agregar una pagina a la carpeta publica, y dijimos que a ella no era necesario estar autenticados por lo tanto cualquier persona puede ingresar

    Agregemos tambien un link a la pagina de bienvenida que creamos anteriormente con la acotación que a ella solo los usuarios autorizados pueden ver


    El codigo de la pagina por si gusta implementar

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <h1>Bienvenido usuario anonimo </h1>
            <h2>En este lugar no hay necesidad de estar autenticado</h2>
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Bienvenida.aspx">Ir a Bienvenidos de Usuarios Autenticados</asp:HyperLink>
        </div>
        </form>
    </body>
    </html>
    

    Todo va viento en popa, el problema es que no se puede ingresar a la zona publica porque la carpeta en cuestión esta dentro del sitio y éste esta dispuesto para que los usuarios anónimos no puedan navegar

    La solución a este problema es agregar un archivo web.Config dentro de la carpeta Publica

    y agregamos el siguiente código

    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <authorization>
            <allow users="*"/>
          </authorization>
        </system.web>
    </configuration>
    allow users = "*"   esto deja pasar a todos los usuarios sin necesidad de que éstos se autentifiquen


    Ahora si nuestro sitio esta funcionando como se espera

    demas esta decir que si tiene alguna pregunta la exponga


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 16:14
  • Una cosa que hemos dejado en el tintero, cada vez que alguien visite su sitio, ingresara directamente a la pagina de Login,

    entonces para solucionar este problema y hacer que cada persona que visite su sitio lo haga ingresando a la zona publica entonces lo unico que debemos hacer es marcar ZonaPublica.aspx como pagina de inicio

    Solucionado el inconveniente ya podemos ver correctamente el sitio funcionando

    lo proximo que tocara hacer es autenticar los usuarios


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 16:23
  • para poder seguir es necesario una base de datos en nuestro proyecto así que yo voy a añadir una pero si usted desea puede saltearse este paso y usar la suya propia

    lo primero que hacemos es clic derecho en nuestro proyecto y seleccionamos add ---:> new ítem y en el cuadro de búsqueda ponemos data, elegimos la opción según la figura y aceptamos

    Le damos un nombre a la BD  y le clickamos en add

    en mi caso como es un proyecto nuevo y si usted quiere experimentar y ha construido un nuevo proyecto como test seguramente le saldrá un mensaje donde decimos que si, este mensaje dice en breves palabras ke no hay un directorio App_Data para situar la BD por lo tanto lo creara por nosotros

    esperamos unos segundos y se creara una archivo de bd en nuestro proyecto,

    lo que sigue ahora es crear una tabla a la cual llamaremos users y agregaremos un par campos ID, username y password (usted si quiere puede agregar cuanto guste o usar el que ya tiene definido)

    una vez creada la tabla agregaremos manualmente dos usuarios admin y usuario


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:14
  • una vez ke todo haya sido creado buscamos en nuestra solución dentro de la carpeta App_data el archivo de nuestra bd y le hacemos doble clic en el para acceder al explorador de servidores

    una vez en el explorador de servidores, desplegamos y nos movemos al nodo de tablas de la BD hacemos click derecho en el y seleccionamos nueva consulta

    se abrirá una ventana en nuestro visual estudio donde crearemos nuestros statements de creación e ingreso de informacion


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:29
  • luego de escribir nuestras consultas, hacemos clic en el icono ejecutar o execute

    dependiendo del idioma de su VS

     verificamos que todo haya sido correctamente ejecutado y ya tendremos nuestra base de datos para trabajar

    aquí le dejo la consulta por si esta siguiendo el test usted también

    CREATE TABLE [dbo].[Users]
    (
    	[id] int NOT NULL PRIMARY KEY identity,
    	[username] NVARCHAR(100) NOT NULL,
    	[password] NVARCHAR(100) NOT NULL,
    )
    go
    
    SET IDENTITY_INSERT [dbo].[Users] ON
    INSERT INTO [dbo].[Users] ([id], [username], [password]) VALUES (1, N'admin', N'admin')
    INSERT INTO [dbo].[Users] ([id], [username], [password]) VALUES (2, N'usuario', N'usuario')
    SET IDENTITY_INSERT [dbo].[Users] OFF
    go


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:34
  • correcto, por eso dije que usted puede hacer uso de su bd o crear una para practicar queda a su criterio, yo me veo en la necesidad de crear un deposito de datos para que el modelo se asemeje lo mayor posible al suyo

    Bien continuando con esto que se ha convertido en un mini tutorial donde abarcamos todo roguemos que los muchachos de Microsoft no se enojen con nosotros por hacer un post realmente largo, pero debo confesar que esta siendo bastante entretenido para mi

    ahora antes que nada debemos agregar al nuestro web.config una sección de código muy importante que y es nuestro connection string

    este debe ir bajo el tag configuration y fuera de System.web

      
    <?xml version="1.0"?>
    
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
    
      <connectionStrings>
        <add name="DefaultConnectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\DBUsers.mdf;Integrated Security=True" providerName="SqlClient"/> 
      </connectionStrings>
      
    <system.web>
       <compilation debug="true" targetFramework="4.0" />
       
    <authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="Bienvenida.aspx"></forms>  
    </authentication>
    
      <authorization>
      <deny users="?"/>
    </authorization>  
    
        </system.web>
    </configuration>
    En negrita he marcado la nueva sección agregada usted por supuesto, asigne la suya propia y trate de manter el archivo de configuración limpio como lo venimos trayendo hasta el momento


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:59
  • Ya estamos en condiciones de autenticar nuestros usuarios o casi lo estamos

    lo que vamos a necesitar ahora es un método ke consulte la base de datos y retorne dos posibles valores

    1 si se encuentra el usuario y algo distinto de 1 en caso contrario

    supongo que usted tendrá una lógica de negocios donde puede colocar este método, yo pondré todo en la el login

    ya que no es mi prioridad el patrón de diseño sino el funcionamiento y mecanismo de la autenticación

    para el siguiente método deberemos hacer referencia a un par de librerías

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

    ahora vamos a crear nuestro método verificador

     private bool AuthenticateUser(string username, string password)
            {
                //connection string lo extraigo de mi web.config
                string CS = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
                
                //mi consulta, usted puede usar un store procedure 
                string query = "Select count(username) from Users where username=@username and password=@password";
    
                using (SqlConnection conn = new SqlConnection(CS))
                {
                    using (SqlCommand cmd = new SqlCommand(query, conn))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("username", username);
                        cmd.Parameters.AddWithValue("password", password);
    
                        conn.Open();
                        int returnCode = (int)cmd.ExecuteScalar();
                        //si existe el usuario entonces la consulta devolvera 1
                        //por lo tanto el retorno sera (1 == 1) verdadero o falso
                        return returnCode == 1;
    
                    }
                }
    
            }

    Bueno esta bastante explicado con comentarios, le daré unos minutos para que usted haga una consulta parecida

    en su almacén de datos


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:15
  • Nota recuerde que

     protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            private bool AuthenticateUser(string username, string password)
            {
                //connection string lo extraigo de mi web.config
                string CS = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
    
                //mi consulta, usted puede usar un store procedure 
                string query = "Select count(username) from Users where username=@username and password=@password";
    
                using (SqlConnection conn = new SqlConnection(CS))
                {
                    using (SqlCommand cmd = new SqlCommand(query, conn))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("username", username);
                        cmd.Parameters.AddWithValue("password", password);
    
                        conn.Open();
                        int returnCode = (int)cmd.ExecuteScalar();
                        //si existe el usuario entonces la consulta devolvera 1
                        //por lo tanto el retorno sera (1 == 1) verdadero o falso
                        return returnCode == 1;
    
                    }
                }
    
            }
    
            protected void btnLogin_Click(object sender, EventArgs e)
            {
    
            }

    se trata de un método, o sea no debe ir dentro de ningún otro evento


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:24
  • ahora el botón de login y ya casi estamos tocando el final de todo esto

    lo ke viene a continuación es lo siguiente

    el usuario entrara por defecto en la carpeta publica por tanto no necesita autenticación

    pero si hace  clic en el link que le dejamos el sistema lo redireccionara a la pagina de Login

    el ingresera sus credenciales y al hacer clic en el botón

    se disparara el mecanismo de autenticación donde será soportado por nuestro método anterior donde verificara si el usuario existe en el almacén de datos

    Veamos el código del boton

     protected void btnLogin_Click(object sender, EventArgs e)
            {
                //llamamos a nustro metodo verificador pasando los argumentos
                //ke son las caja de textos de la pagina
                if (AuthenticateUser(txtUserName.Text, txtPassword.Text))
                {
                    //recordemos ke nustro metodo devuelve true o false por lo tanto si es true
                    //significa ke el usuario existe en la bd y el password es correcto
                    
                    //lo autenticamos en nuestro sitio con el siguiente mecanismo
                    FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chcRememberme.Checked);
                    //el segundo argumento hace referencia al uso de las cookies
                    //si el valor es falso entonces la cokie se destruira cuando el usuario cierre la sesion
                    //si el valor es true o verdadero la cokie permanecera en la pc del cliente por un lapzo de 30 min
                    //el valor es configurable en el web config, ahora bien si el usuario vuelve a abrir el sitio
                    //y el valor cuando se logueo por primera vez fue verdadero el navegador tendra la cookie activa y no sera
                    //necesario volver a autenticarse
                }
                else
                {
                    //si nuestro metodo devuelve falso entonces algo fallo y no es un usuario valido
                    lblResults.Text = "Usuario o Password incorrecto";
                }
              
            }

    esta bastante comentado pero si tiene alguna duda recuerde hacer mención

    en mi ultimo post pondré los resultados del test con fotos


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:39
  • Dios le bendiga y seguimos el lunes aunque esto ya esta terminado solo resta evacuarles algunas dudas, saludos y tenga buen fin de semana

    el resultado fue el esperado saludos y estamos en contacto


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:27
    viernes, 21 de noviembre de 2014 22:50

Todas las respuestas

  • Hola, pruebe esto

    lblNombreAdministrador.Text = "Hola, " + User.Identity.Name;
    creo ke era solo Name perdon


    G. Poliovei


    miércoles, 19 de noviembre de 2014 22:20
  • Hola George perdon por el abuso de confianza se que acabo de terminar una consulta con usted pero no entiendo el error.

    Mire ya coloque el codigo que me indico pero dice que User no existe en el contexto actual

    ese nombre yo lo coloco o es un using no perdon por la pregunta de novato

    miércoles, 19 de noviembre de 2014 22:26
  • public void Page_Load(object sender, EventArgs args)
    {
       lblNombreAdministrador.Text = User.Identity.Name;
    
    }
    


    G. Poliovei

    miércoles, 19 de noviembre de 2014 22:31
  • si no aparece agregue esta referencia junto a los demás using

    using  System.Web.Security
    


    G. Poliovei

    miércoles, 19 de noviembre de 2014 22:34
  • Hola George perdon la molestia

    ya agregue el using y sigue igual

    miércoles, 19 de noviembre de 2014 22:47
  • Ok a ver verifique que tenga este using también

    using System.Web.UI;

    si sigue sin funcionar agregue

     lblNombreAdministrador.Text = Page.User.Identity.Name;

     

    G. Poliovei

    miércoles, 19 de noviembre de 2014 22:55
  • Hola George ya revise y si la tengo 

    agregue lo que me dijo pero aun no invoca da este error

    Referencia a objeto no establecida como instancia de un objeto.

    miércoles, 19 de noviembre de 2014 23:15
  • pero debe agregar sino cambiar

    esta línea

       lblNombreAdministrador.Text = "Hola, " + Session["Usuario"];
    

    por esta otra

     lblNombreAdministrador.Text = Page.User.Identity.Name;


    G. Poliovei

    miércoles, 19 de noviembre de 2014 23:25
  • Si asi lo hice y aun no funciona 

    y en el web.config no tendría que ir nada

    asi me quedo el codigo con lo que me indico

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    using System.Web.Security;
    
    namespace Befit.SysPrincipal.UI
    {
        public partial class PrincipalAdministrador : System.Web.UI.MasterPage
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                //Desabilitar la cache para no retorceder en el navegador
                Response.Cache.SetCacheability(HttpCacheability.NoCache);
                Response.Cache.SetExpires(DateTime.Now.AddDays(-1));
    
                lblNombreAdministrador.Text = Page.User.Identity.Name;
            }
    
            protected void imbCerrarSesion_Click(object sender, ImageClickEventArgs e)
            {
                Session["Autenticacion"] = false;
                Response.Redirect("~/IniciarSesion.aspx");
            }
        }
    }

    y eso esta en mi web.config

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    
      <location path="Administradores.aspx">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location>
    
      <location path="AdmonPrincipal.aspx">
        <system.web>
          <authorization>
            <allow users="*" />
          </authorization>
        </system.web>
      </location>
    <system.web>
        <compilation debug="true" targetFramework="4.0">
          <assemblies>
            <add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
            <add assembly="System.Web.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
            <add assembly="System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
            <add assembly="System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
            <add assembly="System.Web.Extensions.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
            <add assembly="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
          </assemblies>
        </compilation>
      </system.web>    
      
      <connectionStrings>
        <add name="EntidadesSysBefit" connectionString=string base de datos
        
        <add
          name="ODBCDataConnectionString"
          connectionString="Driver=ODBCDriver;server=ODBCServer;"
          providerName="System.Data.Odbc"
        />    
      </connectionStrings>

    que podria ser

    miércoles, 19 de noviembre de 2014 23:34
  • Veo ke usa dotNet 4.0, una pregunta, este trabajo es para un estudio o desarrollo personal, porque podríamos considerar otras alternativas de autenticación   

    G. Poliovei

    jueves, 20 de noviembre de 2014 1:07
  • pues para desarrollo personal George

    cuales alternativas podriamos usar podríamos usar

    otra cosa cuando agrego este codigo en el web.config


    aparece este error. porque aparece esto

    jueves, 20 de noviembre de 2014 1:18
  • Hoy ya es muy tarde, pero si usted hasta mañana no ha solucionado el problema, implementaremos una solucion robusta en materia de logins para su sitio

    Saludos y disculpe mi ausencia, mañana seguimos en contacto


    G. Poliovei


    jueves, 20 de noviembre de 2014 2:17
  • ok gracias perdon que no conteste anoche pero esta muy bien
    jueves, 20 de noviembre de 2014 12:51
  • Sepa disculpar la ausencia he tenido un poco de trabajo extra, la pregunta es pudo solucionar? o trabajamos en ello?

    G. Poliovei

    viernes, 21 de noviembre de 2014 2:24
  • no pude solventar el problema y si no es mucha la molestia me gustaría que trabajemos en ello porque no le halle rumbo 

    muchas gracias por el apoyo

    viernes, 21 de noviembre de 2014 13:33
  • hola

    pero alli lo que menciona es que estas teniendo un problema en el web.config

    authentication Element (ASP.NET Settings Schema)

    ubicas ese tag dentro del <system.web> ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:31
    viernes, 21 de noviembre de 2014 13:54
  • Bueno ahora tengo hora disponible así que comencemos con lo básico

    Para poder brindar una solución sin errores voy a crear un proyecto web vacio(empty) y conforme avanzamos quizás usted pueda solucionar su problema

    Antes de comenzar debería saber si sus Usuarios están en alguna base de datos si es así en que tipo de base y si tiene una clase para dichos usuarios


    G. Poliovei

    viernes, 21 de noviembre de 2014 13:56
  • Si le parece bien podemos trabajar sobre este modelo

    Implementar la autenticación por Formularios, hacer el sitio privado al ingreso al mismo, pero dejamos una puerta abierta a los visitantes que quieren navegar la carpeta publica, en la raíz un página de bienvenida la cual mostrara el usuario autenticado



    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:25
    viernes, 21 de noviembre de 2014 14:29
  • si mis usuarios estan en una base de datos con encriptacion para sus claves en md5

    viernes, 21 de noviembre de 2014 14:53
  • ok ya tengo el modelo george que mas sigue
    viernes, 21 de noviembre de 2014 15:06
  • Correcto

    El siguiente paso entonces agregamos los controles a la pagina de Login

    <body>
        <form id="form1" runat="server">
        <div>
        <h2>Login</h2>
            <table>
                <tr>
                    <td>Usuario</td>
                    <td>
                        <asp:TextBox ID="txtUserName" runat="server"></asp:TextBox></td>
                    <td></td>
                </tr>
                <tr>
                    <td>password</td>
                    <td>
                        <asp:TextBox ID="txtPassword" runat="server"></asp:TextBox></td>
                    <td></td>
                </tr>
                <tr>
                    <td>Recordarme?</td>
                    <td>
                        <asp:CheckBox ID="chcRememberme" runat="server" />   
                    </td>
                    <td></td>
                </tr>
                  <tr>
                    <td>
                        &nbsp;</td>
                    <td>
                        <asp:Button ID="btnLogin" runat="server" Text="Ingresar" />
                    </td>
                    <td></td>
                </tr>
            </table>
        </div>
            <asp:Label ID="lblResults" runat="server" style="color: #FF0000" ></asp:Label>
        </form>
    </body>

    Voy a pasar por alto los validadores nos remitimos a lo mas basico y funcional posible su usted quiere profundizar en algun paso basta que lo mencione


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:25
    viernes, 21 de noviembre de 2014 15:08
  • Ok Todo listo George
    viernes, 21 de noviembre de 2014 15:15
  • Excelente, disculpas si en momentos demoro un poco, estoy alternando entre algunos menesteres y usted

    Seguimos entonces

    Ahora como dijimos antes vamos a restringir la entrada al sitio y establecer la Pagina de Login, eso lo hacemos agregando lo siguiente en el web config

    <?xml version="1.0"?>
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    <configuration>
        <system.web>
          <compilation debug="true" targetFramework="4.0" />
    
      <authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="Bienvenida.aspx"></forms>  
    </authentication>
    
      <authorization>
      <deny users="?"/>
    </authorization>  
    
        </system.web>
    </configuration>
    

    Login Url es cuando un visitante quiera ingresar a alguna zona protegida entonces lo enviara a esta pagina solicitando las credenciales

    default Url: una vez autenticado el usuario deberemos dirigirlo a algun lado, si como veremos mas adelante el usuario no tiene un histórico de navegacion entonces sera redirigido a esta pagina

    deny users="?" esta linea indica que solo usuarios autenticados pueden ver el contenido del sitio

    ya que conocemos esto falta codificar el boton login para que autentique el usuario



    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 15:41
  • Preparemos la pagina de bienvenida

    Siguiendo en la modalidad basica solo agregaremos un label

    Aqui el código de la página por si gusta implementar como test

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Bienvenida.aspx.cs" Inherits="WebMSDNBasicAuth.Bienvenida" %>
    
    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
         <h1>Bienvenido</h1>
          Nombre de usuario: <asp:Label ID="label1" runat="server"></asp:Label>  
        </div>
        </form>
    </body>
    </html>

    Y en el código de servidor de la pagina por ahora quedara asi

      protected void Page_Load(object sender, EventArgs e)
            {
                label1.Text = User.Identity.Name;
            }

    Por obvias razones todavia no podremos ver la página

    pero ya vamos por buen camino


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 15:51
  • no hay problema no se preocupe George 

    ya lo probe muy bueno saber eso que sigue

    viernes, 21 de noviembre de 2014 15:53
  • Siguiendo con nuestra meta ahora vamos a agregar una pagina a la carpeta publica, y dijimos que a ella no era necesario estar autenticados por lo tanto cualquier persona puede ingresar

    Agregemos tambien un link a la pagina de bienvenida que creamos anteriormente con la acotación que a ella solo los usuarios autorizados pueden ver


    El codigo de la pagina por si gusta implementar

    <!DOCTYPE html>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
        <h1>Bienvenido usuario anonimo </h1>
            <h2>En este lugar no hay necesidad de estar autenticado</h2>
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="~/Bienvenida.aspx">Ir a Bienvenidos de Usuarios Autenticados</asp:HyperLink>
        </div>
        </form>
    </body>
    </html>
    

    Todo va viento en popa, el problema es que no se puede ingresar a la zona publica porque la carpeta en cuestión esta dentro del sitio y éste esta dispuesto para que los usuarios anónimos no puedan navegar

    La solución a este problema es agregar un archivo web.Config dentro de la carpeta Publica

    y agregamos el siguiente código

    <?xml version="1.0"?>
    <configuration>
        <system.web>
          <authorization>
            <allow users="*"/>
          </authorization>
        </system.web>
    </configuration>
    allow users = "*"   esto deja pasar a todos los usuarios sin necesidad de que éstos se autentifiquen


    Ahora si nuestro sitio esta funcionando como se espera

    demas esta decir que si tiene alguna pregunta la exponga


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 16:14
  • Una cosa que hemos dejado en el tintero, cada vez que alguien visite su sitio, ingresara directamente a la pagina de Login,

    entonces para solucionar este problema y hacer que cada persona que visite su sitio lo haga ingresando a la zona publica entonces lo unico que debemos hacer es marcar ZonaPublica.aspx como pagina de inicio

    Solucionado el inconveniente ya podemos ver correctamente el sitio funcionando

    lo proximo que tocara hacer es autenticar los usuarios


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 16:23
  • Voy a esperar su confirmacion de que a usted tambien el test le esta funcionando

    G. Poliovei

    viernes, 21 de noviembre de 2014 16:30
  • Hola george enserio disculpe que me ausente pero me surgió una emergencia y tenia que atender y ni tiempo de avisar me quedo.

    se que esta ocupado, ya me funciono el test, esperare su respuesta gracias muchas gracias por el apoyo es de mucha ayuda y dispense no haber avisado antes que me iba a desconetar

    viernes, 21 de noviembre de 2014 20:19
  • Tranquilo es sabido que todos tenemos cosas que atender, yo ya me fui de la oficina, pero supongo que podemos seguir desde aquí, así terminamos el mini proyecto,

    nos faltaría programar el evento del botón de login

    cuando el usuario haga clic se deberá consultar una base de datos verificar si existe el usuario en caso de ser verdaderos lo autenticamos y si no lo es, desplegamos un mensaje advirtiendo que no es usuario valido

    ¿Le parece bien ? 


    G. Poliovei

    viernes, 21 de noviembre de 2014 20:43
  • ok muy bien george gracias

    viernes, 21 de noviembre de 2014 21:00
  • para poder seguir es necesario una base de datos en nuestro proyecto así que yo voy a añadir una pero si usted desea puede saltearse este paso y usar la suya propia

    lo primero que hacemos es clic derecho en nuestro proyecto y seleccionamos add ---:> new ítem y en el cuadro de búsqueda ponemos data, elegimos la opción según la figura y aceptamos

    Le damos un nombre a la BD  y le clickamos en add

    en mi caso como es un proyecto nuevo y si usted quiere experimentar y ha construido un nuevo proyecto como test seguramente le saldrá un mensaje donde decimos que si, este mensaje dice en breves palabras ke no hay un directorio App_Data para situar la BD por lo tanto lo creara por nosotros

    esperamos unos segundos y se creara una archivo de bd en nuestro proyecto,

    lo que sigue ahora es crear una tabla a la cual llamaremos users y agregaremos un par campos ID, username y password (usted si quiere puede agregar cuanto guste o usar el que ya tiene definido)

    una vez creada la tabla agregaremos manualmente dos usuarios admin y usuario


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:14
  • una vez ke todo haya sido creado buscamos en nuestra solución dentro de la carpeta App_data el archivo de nuestra bd y le hacemos doble clic en el para acceder al explorador de servidores

    una vez en el explorador de servidores, desplegamos y nos movemos al nodo de tablas de la BD hacemos click derecho en el y seleccionamos nueva consulta

    se abrirá una ventana en nuestro visual estudio donde crearemos nuestros statements de creación e ingreso de informacion


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:29
  • luego de escribir nuestras consultas, hacemos clic en el icono ejecutar o execute

    dependiendo del idioma de su VS

     verificamos que todo haya sido correctamente ejecutado y ya tendremos nuestra base de datos para trabajar

    aquí le dejo la consulta por si esta siguiendo el test usted también

    CREATE TABLE [dbo].[Users]
    (
    	[id] int NOT NULL PRIMARY KEY identity,
    	[username] NVARCHAR(100) NOT NULL,
    	[password] NVARCHAR(100) NOT NULL,
    )
    go
    
    SET IDENTITY_INSERT [dbo].[Users] ON
    INSERT INTO [dbo].[Users] ([id], [username], [password]) VALUES (1, N'admin', N'admin')
    INSERT INTO [dbo].[Users] ([id], [username], [password]) VALUES (2, N'usuario', N'usuario')
    SET IDENTITY_INSERT [dbo].[Users] OFF
    go


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:34
  • ok eso es por si deseo crear la base de cero verdad

    porque yo puedo seguir usando mi base de datos actal verdad

    viernes, 21 de noviembre de 2014 21:49
  • correcto, por eso dije que usted puede hacer uso de su bd o crear una para practicar queda a su criterio, yo me veo en la necesidad de crear un deposito de datos para que el modelo se asemeje lo mayor posible al suyo

    Bien continuando con esto que se ha convertido en un mini tutorial donde abarcamos todo roguemos que los muchachos de Microsoft no se enojen con nosotros por hacer un post realmente largo, pero debo confesar que esta siendo bastante entretenido para mi

    ahora antes que nada debemos agregar al nuestro web.config una sección de código muy importante que y es nuestro connection string

    este debe ir bajo el tag configuration y fuera de System.web

      
    <?xml version="1.0"?>
    
    <!--
      For more information on how to configure your ASP.NET application, please visit
      http://go.microsoft.com/fwlink/?LinkId=169433
      -->
    
    <configuration>
    
      <connectionStrings>
        <add name="DefaultConnectionString" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\DBUsers.mdf;Integrated Security=True" providerName="SqlClient"/> 
      </connectionStrings>
      
    <system.web>
       <compilation debug="true" targetFramework="4.0" />
       
    <authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="Bienvenida.aspx"></forms>  
    </authentication>
    
      <authorization>
      <deny users="?"/>
    </authorization>  
    
        </system.web>
    </configuration>
    En negrita he marcado la nueva sección agregada usted por supuesto, asigne la suya propia y trate de manter el archivo de configuración limpio como lo venimos trayendo hasta el momento


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 21:59
  • Ya estamos en condiciones de autenticar nuestros usuarios o casi lo estamos

    lo que vamos a necesitar ahora es un método ke consulte la base de datos y retorne dos posibles valores

    1 si se encuentra el usuario y algo distinto de 1 en caso contrario

    supongo que usted tendrá una lógica de negocios donde puede colocar este método, yo pondré todo en la el login

    ya que no es mi prioridad el patrón de diseño sino el funcionamiento y mecanismo de la autenticación

    para el siguiente método deberemos hacer referencia a un par de librerías

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

    ahora vamos a crear nuestro método verificador

     private bool AuthenticateUser(string username, string password)
            {
                //connection string lo extraigo de mi web.config
                string CS = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
                
                //mi consulta, usted puede usar un store procedure 
                string query = "Select count(username) from Users where username=@username and password=@password";
    
                using (SqlConnection conn = new SqlConnection(CS))
                {
                    using (SqlCommand cmd = new SqlCommand(query, conn))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("username", username);
                        cmd.Parameters.AddWithValue("password", password);
    
                        conn.Open();
                        int returnCode = (int)cmd.ExecuteScalar();
                        //si existe el usuario entonces la consulta devolvera 1
                        //por lo tanto el retorno sera (1 == 1) verdadero o falso
                        return returnCode == 1;
    
                    }
                }
    
            }

    Bueno esta bastante explicado con comentarios, le daré unos minutos para que usted haga una consulta parecida

    en su almacén de datos


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:15
  • Hola George fijese que casi me retiro no se si podemos seguir el lunes no le digo que el fin de semana o mas noche porque ademas de ser desconsiderado tambien yo debo hacer este finde en la iglesia asi que no se si hay algun problema???

    viernes, 21 de noviembre de 2014 22:20
  • Nota recuerde que

     protected void Page_Load(object sender, EventArgs e)
            {
    
            }
    
            private bool AuthenticateUser(string username, string password)
            {
                //connection string lo extraigo de mi web.config
                string CS = ConfigurationManager.ConnectionStrings["DefaultConnectionString"].ConnectionString;
    
                //mi consulta, usted puede usar un store procedure 
                string query = "Select count(username) from Users where username=@username and password=@password";
    
                using (SqlConnection conn = new SqlConnection(CS))
                {
                    using (SqlCommand cmd = new SqlCommand(query, conn))
                    {
                        cmd.CommandType = CommandType.Text;
                        cmd.Parameters.AddWithValue("username", username);
                        cmd.Parameters.AddWithValue("password", password);
    
                        conn.Open();
                        int returnCode = (int)cmd.ExecuteScalar();
                        //si existe el usuario entonces la consulta devolvera 1
                        //por lo tanto el retorno sera (1 == 1) verdadero o falso
                        return returnCode == 1;
    
                    }
                }
    
            }
    
            protected void btnLogin_Click(object sender, EventArgs e)
            {
    
            }

    se trata de un método, o sea no debe ir dentro de ningún otro evento


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:24
  • ok george muchisimas gracias no sabe cuanto me a ayudado sus conocimientos enserio muchisimas gracias George
    viernes, 21 de noviembre de 2014 22:27
  • ahora el botón de login y ya casi estamos tocando el final de todo esto

    lo ke viene a continuación es lo siguiente

    el usuario entrara por defecto en la carpeta publica por tanto no necesita autenticación

    pero si hace  clic en el link que le dejamos el sistema lo redireccionara a la pagina de Login

    el ingresera sus credenciales y al hacer clic en el botón

    se disparara el mecanismo de autenticación donde será soportado por nuestro método anterior donde verificara si el usuario existe en el almacén de datos

    Veamos el código del boton

     protected void btnLogin_Click(object sender, EventArgs e)
            {
                //llamamos a nustro metodo verificador pasando los argumentos
                //ke son las caja de textos de la pagina
                if (AuthenticateUser(txtUserName.Text, txtPassword.Text))
                {
                    //recordemos ke nustro metodo devuelve true o false por lo tanto si es true
                    //significa ke el usuario existe en la bd y el password es correcto
                    
                    //lo autenticamos en nuestro sitio con el siguiente mecanismo
                    FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chcRememberme.Checked);
                    //el segundo argumento hace referencia al uso de las cookies
                    //si el valor es falso entonces la cokie se destruira cuando el usuario cierre la sesion
                    //si el valor es true o verdadero la cokie permanecera en la pc del cliente por un lapzo de 30 min
                    //el valor es configurable en el web config, ahora bien si el usuario vuelve a abrir el sitio
                    //y el valor cuando se logueo por primera vez fue verdadero el navegador tendra la cookie activa y no sera
                    //necesario volver a autenticarse
                }
                else
                {
                    //si nuestro metodo devuelve falso entonces algo fallo y no es un usuario valido
                    lblResults.Text = "Usuario o Password incorrecto";
                }
              
            }

    esta bastante comentado pero si tiene alguna duda recuerde hacer mención

    en mi ultimo post pondré los resultados del test con fotos


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:26
    viernes, 21 de noviembre de 2014 22:39
  • Dios le bendiga y seguimos el lunes aunque esto ya esta terminado solo resta evacuarles algunas dudas, saludos y tenga buen fin de semana

    el resultado fue el esperado saludos y estamos en contacto


    G. Poliovei

    • Marcado como respuesta Francisco901 lunes, 24 de noviembre de 2014 20:27
    viernes, 21 de noviembre de 2014 22:50
  • Buenas tardes George 

    Disculpe mi ausencia  pero tenia que hacer este fin de semana en la iglesia y no pude estar hasta el día de hoy,

    enserio muchísimas gracias no sabe como le agradezco a sido de mucha ayuda para completar mi pequeño proyecto muchas gracias como siempre no puedo expresarle mis agradecimientos de otra manera mas que marcando las repuestas muy buenas muy buenos aportes infinitas gracias George

    lunes, 24 de noviembre de 2014 20:30