2011-12-15 11 views
13

Hola, estoy creando un formulario de inicio de sesión desde cero en C# utilizando 3 niveles. Logré construir un formulario de trabajo que verifica si los datos del usuario son correctos. Si ingresó los datos incorrectos, recibirá un mensaje. Pero ahora necesito crear una sesión para almacenar la identificación.Crear sesión en C#

He buscado en la web y dicen que tiene que agregar Session["sessionName"]= data, pero si escribo Session["userId"]=s.studentNummer, él no reconoce nada. ¿Es mejor poner las sesiones en el DAL o en el DLL? Quería escribirlo en el DAL (función checkLogin). ¿Alguien puede ayudarme?

Aquí está mi código:

DALstudent.cs

public class DALstudent 
{ 
    dc_databankDataContext dc = new dc_databankDataContext(); 

    public void insertStudent(Student s) 
    { 
     dc.Students.InsertOnSubmit(s); 
     dc.SubmitChanges(); 
    } 

    public bool checkLogin(string ID, string passw) 
    { 
     bool canlogin = false; 
     var result = (from s in dc.Students 
         where s.studentNummer == ID && s.studentPasswoord == passw 
         select s).Count(); 
     if (result == 1) 
     { 
      canlogin = true; 
     } 
     else 
     { 
      canlogin = false; 
     } 
     return canlogin; 
    } 
} 

BLLstudent.cs

public class BLLstudent 
{ 
    DALstudent DALstudent = new DALstudent(); 

    public void insertStudent(Student s) 
    { 
     DALstudent.insertStudent(s); 
    } 

    public string getMD5Hash(string passwd) 
    { 
     MD5CryptoServiceProvider x = new MD5CryptoServiceProvider(); 
     byte[] bs = Encoding.UTF8.GetBytes(passwd); 
     bs = x.ComputeHash(bs); 
     StringBuilder str = new StringBuilder(); 
     foreach (byte b in bs) 
     { 
      str.Append(b.ToString("x2").ToLower()); 
     } 
     string password = str.ToString(); 
     return password; 
    } 

    public bool checkLogin(string ID, string passw) 
    { 
     bool canlogin = DALstudent.checkLogin(ID, passw); 
     if (canlogin == true) 
     { 
      return true; 
     } 
     else 
     { 
      throw new Exception("Uw gegevens kloppen niet"); 
     } 
    } 
} 

login.aspx.cs

public partial class web_login : System.Web.UI.Page 
{ 
    protected void btnLogin_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      BLLstudent BLLstudent = new BLLstudent(); 
      var loginNr = txtLoginNr.Text; 
      var pass = BLLstudent.getMD5Hash(txtWachtwoord.Text); 
      var passw = pass; 
      BLLstudent.checkLogin(loginNr, passw); 
      Response.Redirect("student/s_procedure_goedkeuring.aspx"); 
     } 
     catch (Exception Ex) 
     { 
      lblFeedback.Text = Ex.Message; 
     } 
    } 
} 
+0

Sírvanse explicar en detalle "que no reconoce nada". Además, el estado de la sesión no entra en el DAL o el BLL. Pertenece directamente a la aplicación web. – David

+0

es su ID de usuario igual que el ID que el usuario usa para iniciar sesión? En caso afirmativo, puede acceder directamente utilizando HttpContext.Current.User.Identity.Name.ToString() siempre que desee datos de identificación, sin necesidad de almacenarlos en la sesión –

+3

MD5 no es un hash seguro. Usa SHA1 o SHA2 y no te olvides de sal. – Bengie

Respuesta

22

.NET sesión estado se maneja en el nivel de presentación, aunque es accesible en cualquier lógica de negocio que se ejecuta en un proceso de trabajo web (tenga en cuenta que también hay estado de sesión fuera de proceso, pero que también se gestiona desde el nivel de presentación) Rara vez es una buena práctica interactuar con sesiones fuera del nivel de presentación.

En la capa de negocio, la sesión se puede acceder con:

System.Web.HttpContext.Current.Session 

Dentro de la mayoría de entidades web (Página, Control, Vista) es simplemente referenciada por Session.

Session es una colección basada en claves; ingresas un valor con una tecla y recuperas el mismo valor con una tecla.

protected override void OnLoad(EventArgs e) 
{ 
    Session["foo"] = "bar"; 
    string valueFromSession = Session["foo"].ToString(); 
} 
+0

¡Gracias! Lo tengo (funciona). Pensé que tenía que ponerlo en el DAL, donde está la consulta, como lo hice en PHP. –

0

El acceso a la sesión es única va a estar disponible en el aplicación web, por lo que deberá establecer y obtener valores de la sesión y pasar estos valores a sus otras capas de la web.

0

También puede utilizar cookies para la sesión:

if (SessionHash != null && (!HttpContext.Current.Request.Cookies.AllKeys.Contains("hash")) { 
    var cookie = new HttpCookie("hash", Convert.ToBase64String(SessionHash)) { 
    HttpOnly = true 
    }; 

    HttpContext.Current.Response.Cookies.Set(cookie); 
} 

// remove cookie on log out. 
HttpContext.Current.Request.Cookies.Remove("hash");