2009-04-10 83 views
0

我已經設置了我的三個角色,admin,employee,user.When我的登錄頁面作爲管理員重定向到Admin/Default.aspx,當登錄爲員工重定向到員工/默認.aspx和當用戶登錄時重定向到User/Default.aspx,我的意思是這3個角色的所有功能都在工作。假設我已經爲他創建了新用戶Sumit,但我沒有給出任何作用,在這種情況下,它已被重定向到Default.aspx頁面,而不是重定向到User/Default.aspx頁面。有人可以幫我請問是什麼原因?這裏是我的全部代碼:需要幫助在頁面身份驗證

Login.aspx.cs:

protected void Login1_LoggedIn(object sender, EventArgs e) 
    { 
     Session["UserName"] = Login1.UserName; 
     Session["Password"] = Login1.Password; 
     string username = Login1.UserName.Trim(); 
     string password = Login1.Password.Trim(); 
     LoginBusinessLayer LB = new LoginBusinessLayer();  
     try 
     {   
      if (LB.GetLogin(username,password) == true) 
      { 
       if (Session["RoleName"].Equals("admin")) 
       { 
        FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false); 
        Response.Redirect("Admin/Default.aspx"); 
       } 
       else if (Session["RoleName"].Equals("employee")) 
       { 
        FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false); 
        Response.Redirect("Employee/Default.aspx"); 
       } 
       else if (Session["RoleName"].Equals("user")) 
       { 
        FormsAuthentication.RedirectFromLoginPage(Login1.UserName, false); 
        Response.Redirect("User/Default.aspx"); 
       } 
       else 
       { 
        Response.Redirect("Default.aspx");//Control is not coming in this else part 
       } 
      } 
     } 
     catch(SqlException ex) 
     { 
      Response.Write(ex.Message); 
     } 
     finally 
     { 
      LB = null; 
     } 
    } 

BusinessLayer.cs:

public class LoginBusinessLayer 
{ 
     public bool GetLogin(string userid, string userrole) 
     { 
      LoginDataLayer LD = new LoginDataLayer(); 
      LD.GetUser(userid,userrole); 
      return true; 
     } 
} 

DataLayer.cs:

public class LoginDataLayer 
{ 
     SqlConnection con; 
     SqlCommand com; 
     SqlDataReader dr; 
     string check;  
     public bool GetUser(string userid, string rolename) 
     { 
      if (HttpContext.Current.Session["UserName"] != null) 
      { 
       con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString); 
       con.Open(); 
       check = "Select ur.UserId,ur.UserName,rl.RoleName from aspnet_Users as ur,aspnet_Roles rl,aspnet_UsersInRoles as ir where ur.UserName = '"+HttpContext.Current.Session["UserName"] + "' and ur.UserId=ir.UserId and ir.RoleId=rl.RoleId"; 
       com = new SqlCommand(check, con); 
       dr = com.ExecuteReader(CommandBehavior.CloseConnection); 
       while (dr.Read()) 
       { 
        if (dr.HasRows) 
        { 
         HttpContext.Current.Session["UserId"] = dr["UserId"].ToString(); 
         HttpContext.Current.Session["RoleName"] = dr["RoleName"].ToString(); 
         return true; 
        } 
       } 
       con.Close();   
      } 
      return false; 
      } 
} 

上面紅色highligted代碼不工作。您的回覆非常感謝。 謝謝, Sumit

+0

嘗試格式化該問題,它嚴重傷害眼睛嘗試閱讀這段文字牆。嘗試將代碼片段放入代碼格式 – Konstantinos 2009-04-10 10:24:33

回答

1

哦,廢話!你的數據層怎麼知道關於HttpContext &的東西?爲什麼你要保留用戶信息Session?你不知道'IPrincipal.IsInRole()`嗎?

+0

Anton是正確的。你需要檢查線程上下文,如果它在數據訪問層。你不是真的想在該層上有HttpContext廢話。另外,如果需要,可以使用Cache來存儲信息,而不是會話......但這有點超出了IMO問題的範圍。 – 2009-04-10 10:48:32

0

在其他部分試試這個...( 「〜/ Default.aspx的」)

其他

{

的Response.Redirect( 「〜/ Default.aspx的」);// Control未在此else部分

}

0

沒有與此代碼多張的問題,其中沒有告訴我爲什麼你的角色的名字沒有被設置的到來。會話[「RoleName」]中的值是什麼?我的猜測是用戶。 :)

現在的一些代碼。您不應該使用Session將信息傳遞到業務層。你有方法參數,所以使用它們。目前你只是忽略它們。

你有一個很好的SQL注入可能性。您正在使用不受信任的用戶數據(Login1.Text)並將其直接放入您的SQL命令中。這是壞的,壞的,壞的。用SQLParameters重寫這個。

如果找到用戶,則不要關閉SQL連接。你只是回來。使用使用統計信息來封裝連接對象,以便連接正確關閉。

雖然方法參數是用戶名和角色名,但您可以使用用戶名和密碼來調用GetLogin。但那沒關係,因爲無論如何您都忽略了它們。 :)您應該使用用戶名和密碼來查找角色名稱。您應該散列密碼並與存儲的散列密碼進行比較。您的GetLogin應該返回一些用戶類或至少角色名稱。

你忽略了GetUser的返回值,所以即使你找不到你說的用戶。

所以要回答你的問題,我不知道你的角色名稱爲什麼設置爲用戶,最有可能是存儲在數據庫中。但是,你真的需要解決這些其他問題。