Создать сеанс в С#

Привет, я создаю форму входа с нуля в С#, используя 3 уровня. Мне удалось создать рабочую форму, которая проверяет правильность данных пользователя. Если он заполнит неверные данные, он получит сообщение. Но теперь мне нужно создать сеанс для хранения идентификатора.

Я искал в Интернете, и они говорят, что вам нужно добавить Session["sessionName"]= data, но если я Session["userId"]=s.studentNummer он ничего не узнает. Лучше ли поставить сеансы в DAL или в DLL? Я хотел записать его в DAL (функция checkLogin). Может кто-нибудь, пожалуйста, помогите мне?

Вот мой код:

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;
        }
    }
}

Ответ 1

Состояние сеанса.NET обрабатывается в уровне представления, хотя оно доступно в любой бизнес-логике, запущенной в процессе веб-работника (обратите внимание, что также отсутствует состояние сеанса процесса, но это тоже управляется из уровня представления). Практически не рекомендуется взаимодействовать с сеансом за пределами уровня представления.

В бизнес-уровне сеанс можно получить с помощью:

System.Web.HttpContext.Current.Session

Внутри большинства веб-объектов (страница, элемент управления, просмотр) он просто ссылается на Session.

Сессия - это сбор на основе ключей; вы поместите значение с помощью ключа, и вы получите одно и то же значение с помощью ключа.

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

Ответ 2

Доступ к сеансу будет доступен только в веб-приложении, поэтому вам нужно будет установить и получить значения из сеанса и передать эти значения другим уровням из Интернета.

Ответ 3

Вы также можете использовать файлы cookie для сеанса:

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");