2009-04-10 17 views
0

Ich habe meine Login-Seite mit drei Rollen, admin, Mitarbeiter, Benutzer.Wenn ich mich als Admin anmelden seine Umleitung zu Admin/Default.aspx, wenn als Mitarbeiter einloggen seine Umleitung zu Employee/Default .aspx und wenn ich als Benutzer seine Umleitung zu User/Default.aspx anmelde, meine ich, dass alle Funktionen dieser 3 Rollen funktionieren. Und angenommen, ich habe einen neuen Benutzer erstellt, sage Sumit für ihn, dass ich keine Rolle gegeben habe, in diesem Fall hätte er auf die Seite Default.aspx umgeleitet werden müssen, statt auf die Seite User/Default.aspx umzuleiten. Könnte jemand mir helfen pls was ist der Grund ??? Hier ist meine gesamte Code:Benötigen Sie Hilfe bei der Seitenauthentifizierung

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

Above red highligted Code ist funktioniert nicht.Ihre Antwort wird sehr geschätzt. Danke, Sumit

+0

versuchen Sie, die Frage zu formatieren, es schmerzt ernsthaft die Augen zu versuchen, diese Wand des Textes zu lesen. Versuchen Sie, das Code-Fragment in das Code-Format – Konstantinos

Antwort

1

Oh Mist! Wie kommt es, dass Ihre Data Layer über HttpContext & Zeug weiß? Warum halten Sie Benutzerinformationen in Session? Wusstest du nichts über 'IPrincipal.IsInRole() `?

+0

zu setzen. Anton hat Recht. Sie müssen den Threadkontext überprüfen, wenn er sich in der Datenzugriffsebene befindet. U möchte eigentlich keinen HttpContext-Mist auf dieser Ebene haben. Verwenden Sie auch den Cache zum Speichern von Informationen, wenn Sie brauchen, nicht Sitzung ... aber das ist ein bisschen über den Rahmen der Frage IMO. –

0

In anderen Teil try this one ... ("~/Default.aspx")

sonst

{

Response.Redirect ("~/Default.aspx");// Steuerung kommt nicht von denen

}

0

Es gibt mulitple Probleme mit diesem Code, keine in diesem sonst Teil mir sagen, warum Name Ihre Rolle ist nicht festgelegt werden. Welcher Wert ist in der Sitzung ["RoleName"]? Meine Vermutung ist Benutzer. :)

Jetzt für einige der Code. Sie sollten Session nicht verwenden, um Informationen an Ihre Business-Schicht weiterzugeben. Sie haben Methodenparameter, also verwenden Sie sie. Momentan ignorierst du sie einfach.

Sie haben eine nette kleine SQL-Injektionsmöglichkeit. Sie nehmen nicht vertrauenswürdige Benutzerdaten (Login1.Text) und legen sie direkt in Ihren SQL-Befehl. Das ist schlecht, schlecht, schlecht. Schreiben Sie dies mit SQLParameters neu.

Sie schließen Ihre SQL-Verbindung nicht, wenn Sie den Benutzer finden. Du kommst einfach zurück. Verwenden Sie eine using-Anweisung, um das Verbindungsobjekt zu umbrechen, damit die Verbindung ordnungsgemäß geschlossen wird.

Sie rufen GetLogin mit Benutzername und Kennwort auf, obwohl die Methodenparameter Benutzername und Rolenname sind. Aber das ist in Ordnung, weil du sie sowieso ignorierst. :) Sie sollten den Benutzernamen und das Passwort verwenden, um den Rollennamen nachzuschlagen. Sie sollten das Passwort Hashing und Vergleich mit einem gespeicherten Hash-Passwort. Ihre GetLogin sollte eine Benutzerklasse oder zumindest den Rollennamen zurückgeben.

Sie ignorieren den Rückgabewert von GetUser, selbst wenn Sie den Benutzer, den Sie sagen, nicht finden.

So, um Ihre Frage zu beantworten, weiß ich nicht, warum Ihr Rollenname auf Benutzer festgelegt ist, wahrscheinlich ist das, was in der DB gespeichert ist. Allerdings müssen Sie diese anderen Probleme wirklich beheben.

Verwandte Themen