2009-04-10 26 views
0

ログインページにadmin、employee、userという3つのロールが設定されています。管理者としてログインしているときにAdmin/Default.aspxにリダイレクトします。従業員としてログインするとEmployee/Default .aspxとUserとしてのログイン時にUser/Default.aspxにリダイレクトすると、これらの3つの役割のすべての機能が動作していることを意味します。そして、私は新しいユーザーを作成したと思う彼のためにSumitは、私は何も役割を与えていないこの場合はDefault.aspxページにリダイレクトされているUser/Default.aspxページにリダイレクトされています。誰かが私を助けることができたpls理由は何ですか?ここに私の全体のコードは次のとおりです。ページ認証のヘルプが必要

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

答えて

1

大失敗!データレイヤーはどのようにしてHttpContext &ものなのですか?なぜユーザー情報をSessionに保存していますか?あなたは 'IPrincipal.IsInRole() `について知りませんでしたか?それ以外の部分では

+0

Antonが正しいです。データアクセスレイヤー内にある場合はスレッドコンテキストをチェックする必要があります。 Uは実際にそのレイヤーにHttpContextを置くことを望んでいません。また、セッションではなく、必要に応じて情報を格納するためにキャッシュを使用してください。しかし、これは質問IMOの対象外です。 –

0

( "〜/ Default.aspxの")...これを試してみてください

{

のResponse.Redirect( "〜/ Default.aspxの");//コントロールは、自分の役割名が設定されていない理由を教えてどれもこのコードのmulitple問題があります

0

この他の部分

}に来ていません。どの値がセッション["RoleName"]にありますか?私の推測はユーザーです。 :)

ここでコードの一部です。セッションを使用してビジネスレイヤに情報を渡すべきではありません。メソッドのパラメータがあるので、それらを使用してください。現在、あなたはそれらを無視しています。

SQLインジェクションの可能性があります。信頼されていないユーザーデータ(Login1.Text)を取得し、それをSQLコマンドに直接置きます。これは悪い、悪い、悪いです。 SQLParametersを使用してこれを書き換えます。

ユーザーが見つかった場合は、SQL接続を終了しないでください。あなたはただ帰ってきます。使用しているstatmentを使用してconnenctionオブジェクトをラップして、接続が適切に閉じられるようにします。

メソッドのパラメータはusernameとrolenameですが、ユーザ名とパスワードでGetLoginを呼び出します。しかし、それはとにかく無視するので、それは大丈夫です。 :)ロールネームを検索するには、ユーザー名とパスワードを使用する必要があります。パスワードをハッシュし、保存されたハッシュパスワードと比較する必要があります。あなたのGetLoginは、いくつかのユーザークラスを返すか、少なくともロール名を返します。

GetUserからの戻り値を無視しているので、あなたが言うユーザーを見つけられなくても。

あなたの質問に答えるために、なぜあなたのロール名がユーザに設定されているのかわかりません。おそらくDBに格納されているものです。しかし、あなたは本当にこれらの他の問題を修正する必要があります。

関連する問題