using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
ViewState["LoginErrors"] = 0;
}
protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
{
if (YourValidationFunction(Login1.UserName, Login1.Password))
{
// e.Authenticated = true;
Login1.Visible = false;
MessageLabel.Text = "Successfully Logged In";
}
else
{
e.Authenticated = false;
}
}
protected void Login1_LoginError(object sender, EventArgs e)
{
if (ViewState["LoginErrors"] == null)
ViewState["LoginErrors"] = 0;
int ErrorCount = (int)ViewState["LoginErrors"] + 1;
ViewState["LoginErrors"] = ErrorCount;
if ((ErrorCount > 3) && (Login1.PasswordRecoveryUrl != string.Empty))
Response.Redirect(Login1.PasswordRecoveryUrl);
}
private bool YourValidationFunction(string UserName, string Password)
{
bool boolReturnValue = false;
string strConnection = "server=example;database=TEST_dw;uid=test;pwd=test;";
SqlConnection sqlConnection = new SqlConnection(strConnection);
String SQLQuery = "SELECT UserName, Password FROM Login";
SqlCommand command = new SqlCommand(SQLQuery, sqlConnection);
SqlDataReader Dr;
sqlConnection.Open();
Dr = command.ExecuteReader();
while (Dr.Read())
{
if ((UserName == Dr["UserName"].ToString()) && (Password == Dr["Password"].ToString()))
{
boolReturnValue = true;
break;
}
Dr.Close();
return boolReturnValue;
}
}
}
코드가 오류없이 실행 중이지만 사용자 이름과 비밀번호를 확인하지 않고 잘못된 사용자 이름과 비밀번호로 성공적으로 로그인합니다. while 루프 및 bool 반환 값 구문 분석에 문제가 있습니다.
while 루프에서 판독기를 닫고의 boolReturnValue
첫 번째 반복 에서 값 을 반환합니다 while
. 즉 if check
, 루프의 첫 번째 반복 에서 가 참이 아닌 경우 항상을 반환 false
합니다.
// previous code
while (Dr.Read())
{
if ((UserName == Dr["UserName"].ToString()) && (Password == Dr["Password"].ToString()))
{
boolReturnValue = true;
break;
}
}
Dr.Close();
return boolReturnValue;
코드는 다음과 같아야합니다. Debug를 사용하면 쉽게 볼 수 있습니다. 디버깅에 대한이 자습서가 유용 할 수 있습니다. 자습서
추신 또한 더 나은 접근 방식은 데이터베이스를 쿼리 하고이 암호와 사용자 이름을 가진 사용자가 있는지 확인하는 것입니다. 모든 사용자를 사용하지 않고 그 후에 루프를 수행하고 확인하십시오. 당신이 100000 사용자가있는 경우이 성능 문제가 될 것입니다 단지 말 ...
private bool YourValidationFunction(string UserName, string Password)
{
string strConnection = "server=example;database=TEST_dw;uid=test;pwd=test;";
SqlConnection sqlConnection = new SqlConnection(strConnection);
sqlConnection.Open();
String query = "SELECT Count(*) FROM Login WHERE UserName=@UserName AND Password=@Password";
SqlCommand command = new SqlCommand(query, sqlConnection);
command.Parameters.AddWithValue("@UserName", UserName);
command.Parameters.AddWithValue("@Password", Password);
int result = Convert.ToInt32(command.ExecuteScalar());
sqlConnection.Close();
return result != 0 ? true : false;
}
마지막 줄은 끈기 연산자 return result != 0 ? true : false;
입니다. 이것은
if(result !=0)
return true;
else
return false;
나는 미래에 다른 클래스에 데이터 액세스 레이어를 작성하도록 조언합니다. 다음은 샘플 DataAccessLayer를 작성한 예제 질문입니다. 사용자 이름 또는 사용자 이메일 확인이 이미 존재합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다