2009-04-10 6 views
0

J'ai défini ma page de connexion avec trois rôles, admin, employé, utilisateur.Lorsque je me connecte en tant qu'administrateur, je redirige vers Admin/Default.aspx, lors de la connexion en tant qu'employé sa redirection vers Employee/Default .aspx et lors de la connexion en tant qu'utilisateur sa redirection vers User/Default.aspx, je veux dire toutes les fonctionnalités de ces 3 rôles fonctionnent fien. Et supposons que j'ai créé un nouvel utilisateur dit Sumit pour lui je n'ai pas donné de rôle, dans ce cas il aurait dû être redirigé vers la page Default.aspx plutôt que sa redirection vers la page User/Default.aspx. Quelqu'un pourrait m'aider pls quelle est la raison ??? Voici mon code entier:Besoin d'aide dans l'authentification de la page

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; 
      } 
} 

code ci-dessus highligted rouge est ne fonctionne pas.Votre réponse est très appréciée. Merci, Sumit

+0

essayer de formater la question, il blesse sérieusement les yeux pour essayer de lire ce mur de texte. Essayez de mettre le fragment de code dans le format de code – Konstantinos

Répondre

1

Oh merde! Comment se fait-il que votre couche de données connaisse HttpContext &? Pourquoi gardez-vous les informations utilisateur dans Session? Vous ne connaissiez pas 'IPrincipal.IsInRole() `?

+0

Anton a raison. vous devrez vérifier le contexte du thread, s'il se trouve dans le Data Access Layer. Je ne veux pas vraiment avoir de merde HttpContext sur cette couche. En outre, utilisez le cache pour stocker des informations si vous en avez besoin, pas de session ... mais c'est un peu au-delà de la portée de la question IMO. –

0

Dans le cadre d'autre essayer celui-ci ... ("~/Default.aspx")

autre

{

Response.Redirect ("~/Default.aspx");// contrôle ne vient pas dans cette partie else

}

0

Il y a des problèmes mulitple avec ce code, dont aucun ne me dire pourquoi le nom de votre rôle n'est pas défini. Quelle valeur est en session ["RoleName"]? Ma conjecture est l'utilisateur. :)

Maintenant pour une partie du code. Vous ne devez pas utiliser Session pour transmettre des informations à votre couche de gestion. Vous avez des paramètres de méthode, alors utilisez les. Actuellement, vous venez de les ignorer.

Vous avez une petite possibilité d'injection SQL. Vous prenez des données utilisateur non fiables (Login1.Text) et les placez directement dans votre commande SQL. C'est mauvais, mauvais, mauvais. Réécrivez ceci en utilisant SQLParameters.

Vous ne fermez pas votre connexion SQL si vous trouvez l'utilisateur. Vous revenez juste. Utilisez une instruction d'utilisation pour envelopper votre objet de connexion afin que la connexion soit correctement fermée.

Vous appelez GetLogin avec un nom d'utilisateur et un mot de passe, bien que les paramètres de la méthode soient username et rolename. Mais c'est ok, car vous les ignorez de toute façon. :) Vous devriez utiliser le nom d'utilisateur et le mot de passe pour chercher le nom de famille. Vous devez hacher le mot de passe et le comparer à un mot de passe haché stocké. Votre GetLogin doit renvoyer une classe d'utilisateurs ou au moins le nom du rôle.

Vous ignorez la valeur de retour de GetUser même si vous ne trouvez pas l'utilisateur que vous dites. Donc, pour répondre à votre question, je ne sais pas pourquoi votre nom de rôle est défini sur utilisateur, très probablement ce qui est stocké dans la base de données. Cependant, vous avez vraiment besoin de résoudre ces autres problèmes.

Questions connexes