
17/01/2008, 02:40
|
| | 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>
|