2013-05-05 53 views
0

我目前正在創建一個CMS並具有用戶可以創建,編輯和刪除用戶的部分。這些信息是從一個數據庫生成的,在這個數據庫中,我使用User_ID,User_Name和User_Password創建了一個表。這意味着我不想使用自動生成的數據庫表VS給你他們的登錄。使用一個數據庫表進行基本登錄

有了這個我試圖開發一個真正的基本登錄,但我無法理解該過程。

這是我的整個應用程序的web.config:

<?xml version="1.0"?> 
<configuration> 
    <connectionStrings> 
    <add name="websiteContent" connectionString="uid=AAA;pwd=AAA;Initial Catalog=AAA;Data Source=.\SQLEXPRESS"/> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.0"/> 
    <authentication mode="Forms"> 
     <forms loginUrl="~/tools/default.aspx" timeout="2880"/> 
    </authentication> 
    </system.web> 
</configuration> 

的Web.config登錄:

<?xml version="1.0"?> 
<configuration> 

    <location path="default.aspx"> 
    <system.web> 
     <authorization> 
     <allow users="*"/> 
     </authorization> 
    </system.web> 
    </location> 

    <system.web> 
    <authorization> 
     <deny users="?"/> 
    </authorization> 
    </system.web> 

</configuration> 

這是我在前端日誌中:

  <asp:Login ID="Login1" runat="server" CssClass="loginSec" TextLayout="TextOnTop" 
       TitleText="" OnAuthenticate="Login1_Authenticate"> 
       <LabelStyle CssClass="lblLogin" /> 
       <TextBoxStyle CssClass="txtLogin" /> 
      </asp:Login> 

從後臺登錄:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    string userName = Login1.UserName; 
    string passWord = Login1.Password; 
    bool rememberUserName = Login1.RememberMeSet; 

    using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString)) 
    { 
     sqlCon.Open(); 
     string SQL = "SELECT CMS_Username, CMS_Password FROM CMS_Users WHERE CMS_Username ='" + userName + "' AND CMS_Password ='" + passWord + "'"; 
     using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon)) 
     { 
      sqlComm.ExecuteScalar(); 

      if (sqlComm.ExecuteScalar() != null) 
      { 
       Response.Redirect("cms.aspx"); 
      } 
      else 
      { 
       Session["UserAuthentication"] = ""; 
      } 
     } 
     sqlCon.Close(); 
    } 
} 

到目前爲止,我所做的一切都阻止了對頁面cms.aspx的訪問,但登錄並不會重定向到頁面。

任何有識之士將不勝感激!

+0

你能告訴你的代碼在cms.aspx,以防止未經授權的訪問? – 2013-05-05 21:38:03

+0

@ Ali.NET我沒有任何,我認爲這是web.config在做什麼? – lauw0203 2013-05-05 21:46:38

+0

@ispiro我在我的URL - http:// localhost:50412/ThirdYearProject/tools/default.aspx?ReturnUrl =%2fThirdYearProject%2ftools%2fcms.aspx中得到了這個。我認爲我沒有正確重定向? – lauw0203 2013-05-05 21:49:19

回答

1

所要求的文檔

自定義的身份驗證方案應通過身份驗證的屬性設置爲 true指示用戶已經通過認證我加入的Authenticated設置。

更多的研究使我的neccessity在您的代碼

FormsAuthentication.SetAuthCookie(Login1.UserName, true); 

此外,我會試圖改變你的代碼,這樣的方式的ExecuteScalar返回的用戶的數量與該用戶名添加這行和密碼。這樣的ExecuteScalar不會返回NULL,但如果沒有用戶存在,或1如果用戶存在,可能是零值(我假設你沒有兩個記錄使用相同的用戶名和密碼)

using (SqlConnection sqlCon = new SqlConnection(ConfigurationManager.ConnectionStrings["websiteContent"].ConnectionString)) 
{ 
    sqlCon.Open(); 
    string SQL = "SELECT COUNT(*) As LoginFound FROM CMS_Users " + 
       "WHERE CMS_Username [email protected] AND CMS_Password = @pwd"; 
    using (SqlCommand sqlComm = new SqlCommand(SQL, sqlCon)) 
    { 
     sqlComm.Parameters.AddWithValue("@usr", userName); 
     sqlComm.Parameters.AddWithValue("@pwd", password); 
     int result = (int)sqlComm.ExecuteScalar(); 
     if (result > 0) 
     { 
      // In case of success you need to communicate this 
      e.Authenticated = Authenticated; 
      FormsAuthentication.SetAuthCookie(Login1.UserName, true); 
      Response.Redirect("~/tools/cms.aspx"); 
     } 
     else 
     { 
      Session["UserAuthentication"] = ""; 
     } 
    } 
} 

另外,我已經從你的sql命令中刪除了字符串連接。這是將字符串文本傳遞到數據庫的正確方法。特別是如果這些值來自您的用戶輸入。

See Sql Injection

編輯 當然的cmd.aspx頁面應該檢查用戶是否已通過驗證,否則人們可以直接鍵入繞過登錄控制cms.aspx頁面的URL。
所以在cms.aspx的Page_Load事件中添加以下代碼

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Request.IsAuthenticated) 
    { 
     Response.Redirect("~/tools/default.aspx"); 
    } 
} 
+0

謝謝@Steve。至於SQL,這是一個臨時的措施,因爲我在模板中使用默認的ASP.NET日誌,我不確定登錄名和密碼文本框默認名稱是什麼。你有什麼主意嗎? – lauw0203 2013-05-05 21:41:47

+0

謝謝你添加你的解釋。但是,當我嘗試登錄時,它會返回到同一頁面?如果我刪除web.config它可以工作,但我可以訪問cms.aspx頁面而不登錄? – lauw0203 2013-05-05 22:11:00

+0

但頁面cms.aspx與default.aspx位於同一文件夾(工具?) – Steve 2013-05-05 22:12:09