PDA

View Full Version : درخواست راهنمایی برای واکشی اطلاعات از sql برای صفحه ورود



hamide_kh
دوشنبه 19 اردیبهشت 1390, 10:43 صبح
با سلام خدمت تمامی دوستان
بنده در جدول کاربران دیتابیسم علاوه بر فیلدهای usernameو password یک فیلد هم به نام active دارم که برای مشخص کردن اینکه آیا این کاربر فعال هست یا نه استفاده میشه
کد زیر را برای واکشی اینکه آیا کاربر username و password را صحیح وارد کرده استفاده می کنم

ALTER PROC [dbo].[sp_Select_User]
@UserName NVARCHAR(50),
@PassWordd NVARCHAR(50)
AS
SELECT Count(*) FROM Tbl_User where ((Username=@UserName)AND(Passwordd=@PassWordd))
و کد در c# نیز این می باشد.

try
{
SqlConnection con = new SqlConnection(SqlConection);
SqlCommand cmd = new SqlCommand("Sp_Select_User", con);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@Username", SqlDbType.NVarChar, 50).Value = TxtUsername.Text;
cmd.Parameters.Add("@Passwordd", SqlDbType.NVarChar, 50).Value = TxtPassword.Text;
con.Open();
int result = (int)cmd.ExecuteScalar();
if (result == 1)
{
timer1.Enabled = true;
label3.Visible = true;
}
else
{
FarsiMessageBox.MessageBox.Show("پیغام", "نام کاربری یا رمز عبور صحیح نمی باشد.", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information);
TxtPassword.Text = "";
TxtUsername.SelectAll();
}
con.Close();
}
catch
{

FarsiMessageBox.MessageBox.Show("پیغام", "در اتصال برنامه به بانک اطلاعاتی خطایی رخ داده است.", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information);
}
حالا من میخوام دستورات sql را طوری تغییر بدم که وقتی در C#کاربر دکمه ورود را میزنه بتونم تشخیص بدم که کاربر active هست یا نه
در ضمن فیلد Active از نوع bit می باشد
کد زیر را امتحان کردم اما Error میده

ALTER PROC [dbo].[sp_Select_User]
@UserName NVARCHAR(50),
@PassWordd NVARCHAR(50)
AS
SELECT Count(*),Active FROM Tbl_User where ((Username=@UserName)AND(Passwordd=@PassWordd))
group by Id_User

FastCode
دوشنبه 19 اردیبهشت 1390, 11:01 صبح
ALTER PROC [dbo].[sp_Select_User]
@UserName NVARCHAR(50),
@PassWordd NVARCHAR(50)
AS
SELECT Count(*) FROM Tbl_User where (Active AND(Username=@UserName)AND(Passwordd=@PassWordd))
group by Id_User

این به سوال ربطی نداره ولی راجع به hash و salt تحقیق کنید.
http://msdn.microsoft.com/en-us/magazine/cc164107.aspx
http://en.wikipedia.org/wiki/Salt_(cryptography)
http://en.wikipedia.org/wiki/Password_cracking

حمیدرضاصادقیان
دوشنبه 19 اردیبهشت 1390, 11:16 صبح
سلام.
معمولا پیشنهاد میشه تا زمانی که براتون مقدور هست از count استفاده نکنید. چون سربار اضافی به سیستمون تحمیل میکنه.
میتونید به این شکل بنویسید.

ALTER PROC [dbo].[sp_Select_User]
@UserName NVARCHAR(50),
@PassWordd NVARCHAR(50)
AS
IF EXISTS(SELECT UserName FROM Tbl_User
Where Username=@UserName AND Passwordd=@PassWord AND Active=1)


در اینجا چک میکنه که آیا این نام کاربر و رمز وجود داره و Active هست یا نه. اگر همه شرایط درست بود میتوانید داخل if دستورات خود رو بنویسید و با یک Else نیز یک خطا با استفاده از raiseError به کاربر برگردونید.

FastCode:

where (Active AND(Username=@UserName)AND(Passwordd=@PassWordd))

این روش کنترل کردن مقدار فیلد bit در داخل SQL server به شما خطا میده و باید با مقادیر 0و1 اونو کنترل کنید.