2015-12-08 54 views
0

我在這裏查看了一下stackoverflow以及Google,但無法找到與我的問題有關的答案,所以我在此處發佈它。使用會話對用戶名和密碼進行身份驗證

我有一個登錄頁面,用戶被指示輸入他們的用戶名和密碼,這些都存儲在MySQL數據庫中。用戶名以純文本形式存儲,並且密碼被散列(使用CrackStation - https://crackstation.net/hashing-security.htm#aspsourcecode),並將散列存儲在數據庫中。我可以使用用戶名和密碼成功登錄一次,但我想使用SESSION,以便用戶可以瀏覽網站,而不必每次登錄到不同的頁面時登錄。我很容易在我的測試環境中使用SESSION,因爲密碼是以純文本形式存儲的,但是現在密碼被散列,我無法讓Session在我的代碼中工作。所以我想知道我能做些什麼來讓密碼在SESSION中驗證。

我的代碼,我用我的登錄頁面如下:

protected void Page_Load(object sender, EventArgs e) 
{ 
    try 
    { 
     admin = Convert.ToInt16(Request.QueryString["Admin"]);    
     Instructor = Convert.ToInt16(Request.QueryString["Inst"]);    

     if (Session["username"] == null || (string)(Session["username"]) == "") 
     {     
      token = Request.QueryString["tokenNumber"]; 

      lblUsername.Visible = true; 
      txtUsername.Visible = true; 
      lblPassword.Visible = true; 
      txtPassword.Visible = true; 
      btnlogin.Visible = true; 
     } 

     else if (Session["username"] != null || (string)(Session["username"]) != "") 
     {     
      username = (string)Session["username"]; 
      userType = (string)Session["userType"]; 
      pass = (string)Session["password"];     

      if (userType == "Participant") 
      {      
       Response.Redirect("/srls/StudentUser"); 
      } 
      else if (userType == "Coordinator") 
      { 
       Response.Redirect("/srls/CoordinatorUser");      
      } 
      else if (userType == "Instructor") 
      { 
       Response.Redirect("/srls/InstructorUser"); 
      } 
     } 


    } 
    catch (Exception exc) //Module failed to load 
    { 
     Exceptions.ProcessModuleLoadException(this, exc); 
    } 
} 

protected void btnlogin_Click(object sender, System.EventArgs e) 
{ 
    char activation; 

    if (Request.QueryString["tokenNum"] != null) 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand = new OdbcCommand(); 
       dbCommand.Connection = dbConnection; 
       dbCommand.CommandText = @"SELECT tokenNum FROM srlslogin WHERE user_email_pk = ?"; 
       dbCommand.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
       dbCommand.ExecuteNonQuery(); 

       OdbcDataReader dataReader = dbCommand.ExecuteReader(); 
       while (dataReader.Read()) 
       { 
        if (token == dataReader["tokenNum"].ToString()) 
        { 
         updateActivationStatus(txtUsername.Text); 
         LoginWithPasswordHashFunction(); 
        } 
        else 
        { 
         test.Text = "You are not authorized to login! Please activate your account following the activation link sent to your email " + txtUsername.Text + " !"; 
        } 
       } 
      } 
      dbConnection.Close(); 
     } 

    } 
    else if (Request.QueryString["tokenNum"] == null) 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand1 = new OdbcCommand(); 
       dbCommand1.Connection = dbConnection; 
       dbCommand1.CommandText = @"SELECT * FROM srlslogin WHERE user_email_pk = ?;"; 

       dbCommand1.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
       dbCommand1.ExecuteNonQuery(); 

       OdbcDataReader dataReader1 = dbCommand1.ExecuteReader(); 
       if (dataReader1.Read()) 
       { 
        activation = Convert.ToChar(dataReader1["activation_status"]); 
        if (activation == 'Y') 
        { 
         activation status, activation == Y"; 
         LoginWithPasswordHashFunction(); 
        } 
        else 
        { 
         lblMessage.Text = "Please activate your account following the Activation link emailed to you at <i>" + txtUsername.Text + "</i> to Continue!"; 
        } 
       } 
       else 
       { 
        lblMessage.Text = "Invalid Username or Password"; 
       } 
       dataReader1.Close(); 
      } 
      dbConnection.Close(); 
     } 
    } 
} 

private void LoginWithPasswordHashFunction() 
{ 
    List<string> salthashList = null; 
    List<string> usernameList = null; 

    try 
    { 
     using (OdbcConnection dbConnection = new OdbcConnection(srlsConnStr)) 
     { 
      dbConnection.Open(); 
      { 
       OdbcCommand dbCommand = new OdbcCommand(); 
       dbCommand.Connection = dbConnection; 
       dbCommand.CommandText = @"SELECT slowhashsalt, user_email_pk FROM srlslogin WHERE user_email_pk = ?;"; 

       dbCommand.Parameters.AddWithValue(@"user_email_pk", txtUsername.Text); 
       OdbcDataReader dataReader = dbCommand.ExecuteReader(); 
       while (dataReader.HasRows && dataReader.Read()) 
       { 
        if (salthashList == null) 
        { 
         salthashList = new List<string>(); 
         usernameList = new List<string>(); 
        } 

        string saltHashes = dataReader.GetString(dataReader.GetOrdinal("slowhashsalt")); 
        salthashList.Add(saltHashes); 

        string userInfo = dataReader.GetString(dataReader.GetOrdinal("user_email_pk")); 

        usernameList.Add(userInfo); 
       } 

       dataReader.Close(); 

       if (salthashList != null) 
       { 

        for (int i = 0; i < salthashList.Count; i++) 
        { 
         bool validUser = PasswordHash.ValidatePassword(txtPassword.Text, salthashList[i]); 
         if (validUser == true) 
         {          
          Session["user_email_pk"] = usernameList[i]; 

          OdbcCommand dbCommand1 = new OdbcCommand(); 
          dbCommand1.Connection = dbConnection; 
          dbCommand1.CommandText = @"SELECT user_status FROM srlslogin WHERE user_email_pk = ?;"; 

          dbCommand1.Parameters.AddWithValue("@user_email_pk", txtUsername.Text); 
          dbCommand1.ExecuteNonQuery(); 

          OdbcDataReader dataReader1 = dbCommand1.ExecuteReader(); 
          while (dataReader1.Read()) 
          { 
           user_status = dataReader1["user_status"].ToString(); 
           Session["userType"] = user_status; 
          } 

          Response.BufferOutput = true; 

          if (user_status == "Participant") 
          { 
           Response.Redirect("/srls/StudentUser", false); 
          } 
          else if (user_status == "Coordinator") 
          { 
           Response.Redirect("/srls/CoordinatorUser", false); 
          } 
          else if (user_status == "Instructor") 
          { 
           Response.Redirect("/srls/InstructorUser", false); 
          } 

          dataReader1.Close(); 
       Response.Redirect(/srls/StudentUser) - Goes to Login Page"; 
         } 
         else 
         { 
          lblMessage.Text = "Invalid Username or Password! Please Try Again!"; 
         } 
        } 
       } 
      } 
      dbConnection.Close(); 
     } 
    } 
    catch (Exception ex) 
    { 

    } 
+0

你熟悉'PostBacks'需要例如在'OnSession_Start'存儲例如聲明一個變量這樣例如 'HttpContext.Current.Session [「isValidUser」 ] = false;'然後在你的登錄或驗證部分的代碼中設置session變量,如果有效用戶爲真 'HttpContext.Current.Session [「isValidUser」] = true;'因爲一個按鈕導致一個PostBack你需要擁有一些'if(!IsPostBack)'在Page_Load事件中檢查你的登錄。 – MethodMan

+0

感謝@MethodMan的建議,我會看看它,看看它是如何工作的。 – skaur

回答

0

你應該在會話中存儲的用戶名和密碼。您應該存儲用戶已成功登錄的「事實」。但實際上,您甚至不應該自己這樣做。 ASP.NET帶有各種身份驗證方法。請看http://www.asp.net/identity開始。

+0

感謝@Mark的回答,我會看看鏈接,並從那裏開始。 – skaur

0

這不是很好的解決方案。不要在會話中存儲用戶名的登錄名,密碼,類型等。一旦用戶登錄您的系統,只需存儲他的ID。我使用下一個方法:我有登錄頁面,我有MasterPage,所有的Web表單都是從MasterPage繼承的。而在母版上Page_Init我做這樣的事情:

string users_role = MyClass.GetUsersRoleById(Session["id"].ToString()); 

我有用戶在數據庫中的作用,所以通過ID我可以排除用戶的角色。而且,例如,每個角色都有一個文件夾。你可以這樣做:

if (String.IsNullOrEmpty(users_role)) //if null it means that user have no any role or you didn't checked for authorization first 
    Response.Redirect(users_role); //redirect to role's page: e.g. Admin, User, Student, Teacher, so on. 
相關問題