PDA

View Full Version : مشکلاتي با تشخيص هويت



bftarane
چهارشنبه 01 آذر 1391, 13:58 عصر
سلام.
من از سيستم تشخيص هويت پيشرفته لينک زير براي سايتم استفاده کردم.
http://how2learnasp.net/article.aspx?code=85c9dd50-0935-48c2-9039-949da6b42f8d
الآن سوالاتي دارم.
1.

در سايت من وقتي فرضاً با نام کاربري a لوگين کرده ام و ميام بدون اينکه خارج شده باشم با يه نام کاربري ديگه وارد ميشم، کاربر دوم مي تونه وارد بشه. اين مشکل رو چه طوري حل کنم؟


...................
2.
من دو تا MasterPage دارم يکي براي ادمين و يکي براي بقيه صفحات. کنترل لوگين را به صورت يوزرکنترل ساخته ام و در Masterpage اصلي قرار دارد و ادمين و بقيه کاربران از طريق اين کنترل لوگين وارد ميشوند. حالا من اين کدها رو فقط در مسترپيج اصلي نوشته ام.

string PageName = System.IO.Path.GetFileName(Request.Path).ToLower() ;
SqlDataReader dr = MyDALBase.ExecuteReader(System.Data.CommandType.St oredProcedure, "GetRolesByPage", new SqlParameter[]{
new SqlParameter("@PageName",PageName)
});
if (dr.Read())
{
if (Page.User.Identity.IsAuthenticated)
{
if (!Page.User.IsInRole(dr["PageRole"].ToString()))
{
Response.Redirect("MsgPage.aspx");
}
}
else
{
FormsAuthentication.RedirectToLoginPage();
}
}

آيا اين مسئله مشکلي ايجاد مي کنه؟ آيا بايد اين کدها را در مسترپيج ادمين هم بنويسم؟
...............................
3.

مشکل ديگري که وجود داره اين است که Admin که لوگين کرد به صفحه اي رفت و در آن صفحه دکمه خروج را زد وقتي دکمه back براوزر را کليک کرد نبايد به عنوان کاربر وارد شده شناخته شود که متأسفانه اين اتفاق نمي افتد و پس از زدن دکمه back با پيام خوشآمدگويي به اين کاربر مواجه ميشوم
اميدوارم منظورم را رسانده باشم.
لطفاً راهنمايي بفرماييد.

اين کدهاي رويداد لوگين من است

if (GetMemberAuthenticate(txt_uname.Text, FormsAuthentication.HashPasswordForStoringInConfig File(txt_pass.Text, "MD5")))
{
string role = GetMemberRoleByID(txt_uname.Text);
DateTime expiration;
if (chk_rememberme.Checked)
{
expiration = DateTime.Now.AddMonths(1);
}
else
{
expiration = DateTime.Now.AddMinutes(30);
}
FormsAuthenticationTicket AuthTicket = new FormsAuthenticationTicket(1, txt_uname.Text, DateTime.Now, expiration, false, role);
string encryptedTicket = FormsAuthentication.Encrypt(AuthTicket);
HttpCookie AuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(AuthCookie);
string[] temp = role.Split(',');
for (int i = 0; i < temp.Length; i++)
{
if (temp[i]=="Admin")
{
Response.Redirect("x.aspx");
}
}

Response.Redirect(FormsAuthentication.GetRedirectU rl(txt_uname.Text, chk_rememberme.Checked));
}
else
{
lbl_login.Visible = true;
}

اين کدهاي دکمه خروج

protected void lnkbtn_signout_Click(object sender, EventArgs e)
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
}

و اين هم قسمتي از کدهاي وب کانفيگ من

<authentication mode="Forms">
<forms loginUrl="Default.aspx" defaultUrl="~/"></forms>
</authentication>

ممنون.

bftarane
چهارشنبه 01 آذر 1391, 17:38 عصر
سلام.
بچه ها در مورد سوال 2 به اين نتيجه رسيدم که بايد در مسترپيج ادمين هم اون کدها نوشته بشه

در مورد سوال 3 يه اتفاق جالب اومدم با کاربر a لوگين کردم بعد خروج رو زدم بعد دکمه back رو زدم که در ليبل نوشته بود خوش آمديد a بازم back زدم در ليبل خوشآمدگويي نوشته شده بود خوش آمديد a
در صورتي که من انتظار داشتم بنويسه خوش آمديد کاربر ميهمان
حالا اومدم در صفحه اي که کاربرا مي تونن عکس آپلود کنن وارد شدم که براي اون به کاربراي غيرعضو اجازه آپلود ندادم وقتي خواستم آپلود کنم اجازه نداد در واقع کاربر واقعاً خارج شده ولي براي اينکه ديگه با بک زدن ليبل همون خوشآمدگويي اول رو نشون نده چکار کنم؟

...........
لطفاً به سوال 1 هم جواب بده هر کس بلده.

saeed_sho
چهارشنبه 01 آذر 1391, 17:48 عصر
چرا از ممبرشیپ استفاده نمیکنید؟
چرا اینقدر خودتون رو درگیر میکنید؟
در ضمن ظاهر سایت رو براساس روانشناسی رنگ ها طراحی کنید رنگ قرمز بک گراند چشمو اذیت میکنه....منو که چشممو زد :گیج:

bftarane
چهارشنبه 01 آذر 1391, 17:56 عصر
نه نمي خوام از ممبرشيپ استفاده کنم مدتهاي زيادي درگير اين قضيه بودم و خيلي تحقيق کردم مثلاً مدت زيادي وقت سر ياد گرفتن Custom membership provider و Custom membership user وقت گذاشتم و آخرش به اين نتيجه رسيدم که از نظر انعطاف پذيري اصلاً سيستم ممبرشيپ خوب نيست در هر صورت من الآن از اين سيستم استفاده کردم فقط مي خوام اين مشکلاتش رفع بشه.
.......................
در مورد ظاهر اگه دقت کرده باشين کار نهايي نشده و خيلي ظاهرش ممکنه تغيير کنه ولي اون رنگ قرمز نيست و از خانواده قهوه اي ها هستش و به نظر من خيلي خوشرنگ و جذابه. کانتنت رو هم که يه رنگ روشن انتخاب کردم تا کاربر موقع خوندن متن اذيت نشه.
ممنون از نظري که دادين.
احتمالاً مدتي ديگه کار رو مي زارم براي نظرخواهي.

fakhravari
چهارشنبه 01 آذر 1391, 20:01 عصر
سشن کاربر 1
38E4E985423A90EDE16500827B4F550BBF4D41A19E6AF2994F 41863A2B0945A165D789F585156455D632367F532BE4AE89ED 73B2B2B344123E2920A5B56F5F6DC5864CD4A750F235B047C8 F05B72C95302983DC6D30CC74BBF069E320FCAE6FA
سشن کارب 2
6E2D87C9CF8E4B2327CFC164DBF468758CCE5E5CDC3F628F99 49B482837C004E8664118D7596B5BEF94FFAA39A7C4426E2D0 250AC7E3235E2750C869446482C12C53A5E3E6B8A365D04022 F3BB1B4E04F40E6989AE384288A966FF4E59326352
سشن کاربر 3
464FA33B57699888BF9D87CAF676139FA16335ED3D96AEF0A1 F0F553B4D98E4B575EA50196EE5A849EF6E10CB71CEAA4327A 5AF249728D38B2E0B7E2BECA1F2C837290E8E1D1BAB15D63EF 999B332FEF
احتمال زیاد HttpCookie AuthCookie وقتی کوکی ایجاد می کند به قول خودمون replace میشه روی کوکی قبلی.
protected void btn_submit_Click(object sender, EventArgs e)
{
string role = GetMemberRoleByID(txt_uid.Text);
FormsAuthenticationTicket AuthTicket = new FormsAuthenticationTicket(1, txt_uid.Text, DateTime.Now, DateTime.Now.AddHours(1), false, role);
string encryptedTicket = FormsAuthentication.Encrypt(AuthTicket);
HttpCookie AuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
Response.Cookies.Add(AuthCookie);

Response.Redirect(FormsAuthentication.GetRedirectU rl(txt_uid.Text, chk_member.Checked));
}

bftarane
چهارشنبه 01 آذر 1391, 20:17 عصر
يه دنيا تشکر آقاي فخرآوري. حداقل اين مي تونه يه سرنخ باشه. مي رم دنبال حل اين قضيه اگه نتونستم حلش کنم ميام مطرح مي کنم.

راستي از اين سشن ها چه نتيجه اي مي خواستيد بگيريد؟ من متوجه نشدم. منظورتون اين بود که هنوز سشن کاربر اول تموم نشده ولي کاربر بعدي مي تونه لوگين کنه درسته؟

bftarane
پنج شنبه 02 آذر 1391, 07:51 صبح
آقاي فخرآوري شما چطور اون سشن آي دي ها رو به دست آورديد؟
من کد زير رو در رويداد لود گذاشتم

Response.Write(HttpContext.Current.Session.Session ID);
و براي کاربر ميهمان و کابر a , b نتيجه يکسان بود.

ekemmk4kqjeosjn5f05gph52 کاربر ميهمان

ekemmk4kqjeosjn5f05gph52 کاربر a

ekemmk4kqjeosjn5f05gph52 کاربر b
من در لوکال امتحان کردم.
نکنه شما منظورتون سشن آي دي نبوده؟

آقاي فخرآوري شما خودتون از چه سيستمي استفاده مي کنيد براي تشخيص هويت؟

اگه کسي لينک ديگه اي ميشناسه که اين روش تشخيص هويت رو آموزش داده باشه ممنون ميشم برام بزاره. چه انگليسي چه فارسي.
سرچ که مي زدم يه جا خوندم همين که سشن آي عوض بشه در رويداد لوگين مثل اينکه باعث امنيته و پس من اگه بخوام جلوي اين کار رو بگيرم امنيت رو کاهش دادم. لينکش رو ندارم که اينجا بزارم. البته نمي دونم ميشه به اون مطلب اطمينان داشت يا نه.


خيلي عجيبه براوز رو هم که مي بندم باز دوباره باز مي کنم سشن آي دي تغييري نمي کنه
ولي وقتي کلاً ويژوال استوديو رو بستم و دوباره ران کردم و اجرا کردم سايت رو اون موقع تغيير کرد

من حتي فايل ضميمه خود اون لينک آموزشي رو هم امتحان کردم اونم اين مشکل رو داشت.

fakhravari
پنج شنبه 02 آذر 1391, 11:26 صبح
سلام
یا از ممبرشیپ استفاده میکنم یا برای خودم جدا درست میکنم.
سشن در مرورگر فایرفاکس می گرفتم.

bftarane
پنج شنبه 02 آذر 1391, 11:28 صبح
واقعاً ديگه موندم چيکار کنم. رفتم با کنترلهاي آماده خود Asp.net امتحان کردم ديدم هر دو مشکل چه مشکل Back براوزر و چه ورود يه فرد با نام کاربري جديد در حالي که خروج رو نزده و صفحه رو نبسته اونجا هم وجود داره.

چرا پس اين ايراد رو از کار من گرفتن؟

خوب حالا چي کار ميشه کرد؟:عصبانی++:

bftarane
پنج شنبه 02 آذر 1391, 15:12 عصر
سلام مجدد بچه ها.
يه ايده اي دارم به نظرتون خوبه؟
بيام بگم
string currentusername=user.identity.name
بعد
بيام وقتي کاربر هنوز خارج نشده و دکمه لوگين رو زد با اسم کاربري جديد چک کنم اگه
txtusername != currentusername
پيغام بدم که شما هم اکنون با يه نام کاربري ديگه login هستيد.
چطوره؟

راستي معني اين جمله رو ببينيد درست فهميدم (آخه تو سايت http://forums.asp.net همين سوال رو پرسيدم يکي اين جوري جواب داده)
Place your authenticated status checking at the login form and redirect user to the default landing page if authenticated.
در صفحه لوگين بيا چک کن کاربر authenticate هست يا نه اگه بود بفرستش به صفحه پيشفرض
اگه درست فهميده باشم که در واقع جوابش به درد نمي خوره چون خودم اين کار رو کردم ديگه.

bftarane
جمعه 03 آذر 1391, 12:22 عصر
جواب سوال اول خيلي ساده بودم
اومدم يه صفحه به نام مثلاً signout.aspx درست کردم
و دکمه خروج رو در اون گذاشتم بعد در رويداد کليک دکمه لوگين کد زير رو اضافه کردم

if (Page.User.Identity.IsAuthenticated)
{
Response.Redirect("Default4.aspx");
}

و يه پيغام به کاربر مي دم که اگه مي خواد مجدداً وارد شه بايد با دکمه خروج رو کليک کنه.
البته اين مسئله خيلي احتمال وقوعش کمه که يه نفر در حالي که هنوز خارج نشده بياد با يه نام کاربري ديگه وارد شه ولي خوب
اين احتمال صفر نيست.
ولي در مورد دکمه back هنوز نتونستم به جواب قطعي برسم.
پست 14 اين لينک http://barnamenevis.org/showthread.php?367678 راهنماي خيلي خوبي بود

چند تا لينک هم پيدا کردم مثل اينا

http://geekswithblogs.net/Frez/archive/2010/05/18/back-button-issue-after-logout-in-asp.net.aspx

http://stackoverflow.com/questions/2686946/asp-net-authentication-login-and-logout-with-browser-back-button
ولي هنوز به جواب قطعي نرسيدم چون من نمي خوام Cache مرورگر غيرفعال بشه.