在页面验证中需要帮助

时间:2009-04-10 10:19:55

标签: asp.net

我已经设置了我的登录页面,其中包括三个角色,admin,employee,user。当我以管理员身份登录时,它会重定向到Admin / Default.aspx,当登录为employee时,它会重定向到Employee / Default.aspx并在登录时作为用户重定向到User / Default.aspx,我的意思是这三个角色的所有功能都是有效的。并且假设我已经为他创建了新用户说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;
          }
}

以上红色高亮度代码无效。您的回复非常感谢。 谢谢, 萨米特

3 个答案:

答案 0 :(得分:1)

哦,废话!您的数据层如何知道HttpContext&东西?为什么要在Session中保留用户信息?你不知道'IPrincipal.IsInRole()`吗?

答案 1 :(得分:0)

在其他部分尝试这个...(“〜/ Default.aspx”)

否则

{

Response.Redirect(“〜/ Default.aspx”); //控制不会进入其他部分

}

答案 2 :(得分:0)

此代码存在多个问题,但没有一个问题告诉我为什么没有设置您的角色名称。会话[“RoleName”]中有什么价值?我的猜测是用户。 :)

现在提供一些代码。您不应该使用Session将信息传递给业务层。你有方法参数,所以使用它们。目前你只是忽略它们。

你有一个很好的小SQL注入可能性。您正在获取不受信任的用户数据(Login1.Text)并将其直接放入您的SQL命令中。这是坏事,坏事,坏事。使用SQLParameters重写此内容。

如果找到该用户,则不会关闭SQL连接。你回来了。使用using statment来包装连接对象,以便正确关闭连接。

使用用户名和密码调用GetLogin,但方法参数是username和rolename。但那没关系,因为无论如何你都会忽略它们。 :)您应该使用用户名和密码来查找角色名称。您应该对密码进行哈希处理并与存储的哈希密码进行比较。您的GetLogin应该返回一些用户类或至少返回角色名称。

您忽略了GetUser的返回值,即使您没有找到您说的用户。

因此,为了回答您的问题,我不知道为什么您的角色名称设置为用户,很可能是存储在数据库中的名称。但是你真的需要解决这些问题。