Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/01/2008, 02:40
Ciberyo
 
Fecha de Ingreso: diciembre-2007
Mensajes: 36
Antigüedad: 17 años, 3 meses
Puntos: 0
Problema con Loggin usuarios en ASP.NET (me urge mucho)

Hola a todos, estoy haciendo una web en ASP.net y debe de restringir el acceso a contenido según el rol, en el código podéis ver que busco al usuario y compruebo que la contraseña coincida, el caso es que me devuelve el rol pero luego no me deja acceder a la sección que le correspondería

el código de la pagina de logueo es esta

Código:
using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Data.SqlClient;



public partial class Default2 : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {



    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        if (txtuser.Text != "" & txtpass.Text != "")

        {

            string rol = IsAuthenticated(this.txtuser.Text, this.txtpass.Text);

                if (rol != "")

                {

                    FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, txtuser.Text, DateTime.Now, DateTime.Now.AddMinutes(30), false, rol);

                    //Encriptar el type

                    string encryptedTicket = FormsAuthentication.Encrypt(authTicket);

                    //crear la coockie con el ticket cifrado

                    HttpCookie authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

                    //añadimos la cookie a la coleccion de cookies del navegador

                    Response.Cookies.Add(authCookie);

                    //Response.Redirect(FormsAuthentication.GetRedirectUrl(txtuser.Text, false));

                }

                else

                {

                    Response.Write("<script>alert('El usuario especificado no existe')</script>");

                }   

        }

        else

        {

            Response.Write("<script>alert('Tanto el nombre de usuario como al contraseña son obligatorios para loguearse')</script>");

        }

    }



    private string IsAuthenticated(string username, string password)

    {

        // Comprobamos que el usuario existe en nuestra base de datos y que la contraseña es la correcta

        SqlConnection objconectar = new SqlConnection(ConfigurationManager.ConnectionStrings["conexioncartelera"].ToString());

        //Abrimos la conexion

        objconectar.Open();

        //Creamos la variable tipo Command y le asignamos la consulta sql para que nos busque solo por el apellido asignado

        SqlCommand Consulta = new SqlCommand("SELECT rol from cliente Where idcliente=@pidcliente and pass=@ppass;", objconectar);

        Consulta.Parameters.Add("@pidcliente", SqlDbType.VarChar);

        Consulta.Parameters["@pidcliente"].Value = this.txtuser.Text;

        Consulta.Parameters.Add("@ppass", SqlDbType.VarChar);

        Consulta.Parameters["@ppass"].Value = this.txtpass.Text;

        //Ejecutamos la cosulta y la asignamos al lector.

        string rol = Convert.ToString(Consulta.ExecuteScalar());

        //Cerramos conexión y desechamos la variable

        objconectar.Close();

        objconectar.Dispose();

        return rol;



    }

}
el global asax

Código:
<%@ Application Language="C#" %>



<script runat="server">



    void Application_AuthentificateRequest(Object sender, EventArgs e)

    {

        //Extraer la autentificacion de la cookie

        string cookiename = FormsAuthentication.FormsCookieName;

        HttpCookie authcookie = Context.Request.Cookies[cookiename];

        //Compruebo que la cookie es valida

        if (null == authcookie)

        {

            return;



        }



        FormsAuthenticationTicket authTicket = null;



        try

        {

            authTicket = FormsAuthentication.Decrypt(authcookie.Value);

        }

        catch

        {

            //fallo al desencriptar

            return;



            if (null == authTicket)

            {

                return;

            }

        }



        //Una vez esta el ticket creada le asignamos los roles de usuario

        string[] roles = authTicket.UserData.Split(new char[] { '|' });

        

        //Crear el objeto identidad

        FormsIdentity id = new FormsIdentity(authTicket);

        System.Security.Principal.GenericPrincipal Principal = new System.Security.Principal.GenericPrincipal(id, roles);

        //añadir el objeto principal al actual httpcontext

        Context.User = Principal;

    }



    void Application_Start(object sender, EventArgs e)

    {

        // Código que se ejecuta al iniciarse la aplicación



    }





    void Application_End(object sender, EventArgs e)

    {

        //  Código que se ejecuta cuando se cierra la aplicación



    }



    void Application_Error(object sender, EventArgs e)

    {

        // Código que se ejecuta al producirse un error no controlado



    }



    void Session_Start(object sender, EventArgs e)

    {

        // Código que se ejecuta cuando se inicia una nueva sesión



    }



    void Session_End(object sender, EventArgs e)

    {

        // Código que se ejecuta cuando finaliza una sesión. 

        // Nota: El evento Session_End se desencadena sólo con el modo sessionstate

        // se establece como InProc en el archivo Web.config. Si el modo de sesión se establece como StateServer 

        // o SQLServer, el evento no se genera.



    }

       

</script>
el web.config de la zona libre

Código:
<?xml version="1.0"?>

<!-- 

    Nota: como alternativa para editar manualmente este archivo puede utilizar la 

    herramienta Administración de sitios Web para configurar los valores de la aplicación. Utilice

    la opción Sitio Web->Configuración de Asp.Net en Visual Studio.

    Encontrará una lista completa de valores de configuración y comentarios en 

    machine.config.comments, que se encuentra generalmente en 

    \Windows\Microsoft.Net\Framework\v2.x\Config 

-->

<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">

	<appSettings/>

	<connectionStrings>

    <!-- Aqui definimos la conexion con la bases de datos

        -->

  <add name="conexioncartelera" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=diaznoriega;Integrated Security=True;Pooling=False"

   providerName="System.Data.SqlClient" />

 </connectionStrings>

	<system.web>

    <httpRuntime useFullyQualifiedRedirectUrl="true" />

		<!-- 

            Establezca debug="true" en la compilación para insertar símbolos 

            de depuración en la página compilada. Dado que este 

            proceso afecta al rendimiento, debe establecer este valor como true 

            durante la depuración.

        -->

		<roleManager enabled="true" />

  <httpHandlers>

			<add path="Reserved.ReportViewerWebControl.axd" verb="*" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" validate="false"/>

		</httpHandlers>

		<compilation debug="true">

			<buildProviders>

				<add extension=".rdlc" type="Microsoft.Reporting.RdlBuildProvider, Microsoft.ReportViewer.Common, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>

			</buildProviders>

		</compilation>

		<!--

            La sección <authentication> permite configurar 

            el modo de autenticación de seguridad utilizado por 

            ASP.NET para identificar a un usuario entrante. 

     -->





    <authentication mode="Forms">

      <forms loginUrl="Logueo.aspx" name="AuthCookie" timeout="30" path="/">

      </forms>

    </authentication>

    <!--  Permito a todos los usuarios  -->

    <authorization>

      <allow users="*"/>

      </authorization>

		<!--

            La sección <customErrors> permite configurar 

            las acciones que se deben llevar a cabo/cuando un error no controlado tiene lugar

            durante la ejecución de una solicitud. Específicamente, 

            permite a los desarrolladores configurar p√°ginas de error html 

            que se mostrar√°n en lugar de un seguimiento de pila de errores.



        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">

            <error statusCode="403" redirect="NoAccess.htm" />

            <error statusCode="404" redirect="FileNotFound.htm" />

        </customErrors>

        -->

	</system.web>

</configuration>
y el web.config de una de las secciones (En este caso la de administrador)

Código:
<?xml version="1.0" encoding="utf-8"?>

<!-- Nota: como alternativa para editar manualmente este archivo puede utilizar la herramienta Administración de sitios Web para

     configurar los valores de la aplicación. Utilice la opción Sitio Web->Configuración de Asp.Net

     en Visual Studio.

    Encontrará una lista completa de valores de configuración y comentarios en machine.config.comments, que se encuentra

     generalmente en \Windows\Microsoft.NET\Framework\v2.0.xxxxx\Config

 -->

<configuration>

  <appSettings/>

  <connectionStrings/>

  <system.web>

    <authorization>

      <allow roles="administrador" />

      <deny users="*" />

    </authorization>

  </system.web>

</configuration>