我已经设置了我的登录页面,其中包括三个角色,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;
}
}
以上红色高亮度代码无效。您的回复非常感谢。 谢谢, 萨米特
答案 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的返回值,即使您没有找到您说的用户。
因此,为了回答您的问题,我不知道为什么您的角色名称设置为用户,很可能是存储在数据库中的名称。但是你真的需要解决这些问题。