2009-04-10 84 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的返回值,所以即使你找不到你说的用户。

所以要回答你的问题,我不知道你的角色名称为什么设置为用户,最有可能是存储在数据库中。但是,你真的需要解决这些其他问题。