PDA

View Full Version : مدیریت لاگین شدن کاربران برنامه asp



baran129
دوشنبه 25 آبان 1394, 09:12 صبح
سلام

من یه برنامه تحت وب کار کردم که صفحه اولش صفحه لاگین هست که بعد از لاگین کاربر به یکی از فرم ها redirect میشه. همه این فرم ها هم masterpage دارن به جز اون صفحه لاگین. حالا من میخوام یه راه حلی پیدا کنم که نذارم دو تا کاربر همزمان با یه نام کاربری وپسورد وارد برنامه بشن. یعنی اگه کاربر اول لاگین بود به کاربر دوم بگه که این کاربر قبلا وارد سیستم شده و نذاره اون لاگین کنه.
میخوام وقتی کاربر اول مرورگرو میبنده یا نت قطع میشه یا اصلا سیستم خاموش میشه خودکار logout شه تا بعدا بتونه لاگین کنه
البته اینم بگم که من تو masterpage یه منو دارم که هر آیتمش لینک داده شده به یکی از فرم ها و کاربر میتونه هر کودوم از اونارو تو یه تب جدید یا پنجره جدید باز کنه. نمیدونم چطوری مدیریت کنم این مساله رو :(

خیلی ممنون میشم اگه کمکم کنین
خیلی سرچ کردم و امتحان کردم ولی هنوز به نتیجه ای نرسیدم

notlikeothers
دوشنبه 25 آبان 1394, 10:09 صبح
درود.شما در هنگام ثبت نام نباید بزارید دو نفر با نام کاربری و پسورد یکسان ثبت نام کنند.
در مورد اینکه مرورگر بسته میشه یا نت قطع میشه اینا شما باید وقتی کاربر لاگین کرد یه سشن درست کنی و تو مستر پبج قبل هر کاری چک کنی اگر سشن خالی بود کاربر بنداره بیرون.
مشکل سوم نفهمیدم

baran129
دوشنبه 25 آبان 1394, 11:40 صبح
درود.شما در هنگام ثبت نام نباید بزارید دو نفر با نام کاربری و پسورد یکسان ثبت نام کنند.
در مورد اینکه مرورگر بسته میشه یا نت قطع میشه اینا شما باید وقتی کاربر لاگین کرد یه سشن درست کنی و تو مستر پبج قبل هر کاری چک کنی اگر سشن خالی بود کاربر بنداره بیرون.
مشکل سوم نفهمیدم


ممنون که جواب دادین
میدونین بحث ثبت نام نیست اصلا چون کاربرارو خودم تعریف میکنم و یوزر و پسورد رو بهشون میدم حالا میخوام از یه یوزر و پس چند تا کاربر همزمان لاگین نشن

fmka2f
دوشنبه 25 آبان 1394, 13:07 عصر
ببین اونجا که چک میکنی کاربر یوزرو پسوردشو درست زده یه سشن در نظر بگیر و مقدارشو مثلا بذار یک.حالا دفعه بعد چک کنه که اگه سشن یک بود پیام بده که این یوزر قبلا وارد شده
و چون سشن اعتبارش تا زمانیه که مرورگر بازه هر وقت مرورگر بسته شه یا سیستم خاموش شه کاربرو میندازه بیرون

fmka2f
دوشنبه 25 آبان 1394, 13:10 عصر
سشن رو تو پیج لود مسترپیج که چک کنی اون کاربر میتونه هرچندتا پیج رو باز کنه رو اون سیستم ولی رو سیستم دیگه بره چون سشن قبلا یک شده نمیزاره اصلا وارد شه.اگه بد توضیح دادم بگو

baran129
دوشنبه 25 آبان 1394, 15:04 عصر
سشن رو تو پیج لود مسترپیج که چک کنی اون کاربر میتونه هرچندتا پیج رو باز کنه رو اون سیستم ولی رو سیستم دیگه بره چون سشن قبلا یک شده نمیزاره اصلا وارد شه.اگه بد توضیح دادم بگو

مرسی بابت جوابتون
ببینین منم از session استفاده کردم موقع لاگین مثلا یوزرنیم رو توش قرار میدم ولی یه لیستم استفاده میکنم که کاربرایی که لاگین هستن رو توش نگه میدارم
هر کاربری که مرورگرو ببنده یا خودش لاگ اوت کنه از اون لیست حذف میشه پس اگه یه کاربر دیگه از یه سیستم دیگه با همین یوزرنیم بخواد وارد شه میتونه چون دیگه تو لیست لاگین ها نیست
چیزی که شما میگین اینه که فقط از همون session استفاده کنم
خب برا هر کاربر این session یه مقداری رو داره دیگه متغیر سمت سرور نیست که همه ی یوزرها همون مقدارو ببینن! درسته؟؟

EnKamran
سه شنبه 26 آبان 1394, 13:50 عصر
دوست عزیز شا یک سیشن درست کنید به نام UserName و مقدار نام کاربری کاربر لاگین شده رو توش نگه دارید حالا زمان لاگین شدن چک کنید ببینید چنین سیشنی وجود داره یا خیر اگر وجود داشته باشه یعنی کاربر از یک جایی لاگین هست و اجازه ورود ندید اگر هم وجود نداشته باشه یعنی کاربر یا صفحه رو بسته یا لاگ اوت کرده پس اجازه ورود داده میشه.

EnKamran
سه شنبه 26 آبان 1394, 13:51 عصر
شما اصلا مقدار سیشن رو نیاز ندارید فقط نیاز دارید ببینید چنین سیشنی وجود داره یا خیر.

baran129
چهارشنبه 27 آبان 1394, 11:21 صبح
دوست عزیز شا یک سیشن درست کنید به نام UserName و مقدار نام کاربری کاربر لاگین شده رو توش نگه دارید حالا زمان لاگین شدن چک کنید ببینید چنین سیشنی وجود داره یا خیر اگر وجود داشته باشه یعنی کاربر از یک جایی لاگین هست و اجازه ورود ندید اگر هم وجود نداشته باشه یعنی کاربر یا صفحه رو بسته یا لاگ اوت کرده پس اجازه ورود داده میشه.
ممنون بابت جوابتون
اما یه مشکلی هست. من تو رویداد کلیک باتن ورود بعد از اینکه اجازه ورود میدم نام کاربری رو تو سشن ذخیره میکنم و میبرمش تو یه فرم دیگه خب حالا کجا چک کنم ببینم این سشن به قول شما اصلا وجود داره یا نه. برای اولین بار که میخواد لاگین کنه با یه نام کاربری اونوقت این چک کردن سشن چطوری میشه
شایدم من منظورتونو درست متوجه نشدم

fmka2f
چهارشنبه 27 آبان 1394, 12:10 عصر
شما تو همون رویداد کلیک دکمه ورود باید چک کنی.اگه سشن "مخصوص چک کردن تکرار ورود" وجود داشت که پیام بده با این یوزر قبلا وارد شده در غیر اینصورت همونجا کاربر لاگین بشه و سشن "مخصوص چک کردن تکرار ورود" رو بسازی

baran129
چهارشنبه 27 آبان 1394, 12:34 عصر
شما تو همون رویداد کلیک دکمه ورود باید چک کنی.اگه سشن "مخصوص چک کردن تکرار ورود" وجود داشت که پیام بده با این یوزر قبلا وارد شده در غیر اینصورت همونجا کاربر لاگین بشه و سشن "مخصوص چک کردن تکرار ورود" رو بسازی

بله متوجه شدم بعدش فقط نمیدونم چطوری چک کنم که مثلا ["session["username با مقدار "a" (که a یه نام کاربری هست) وجود داره یا نه

baran129
چهارشنبه 27 آبان 1394, 12:37 عصر
اگه منظورتون چک کردن با این کد هست که من چک کردم ولی باز اجازه میده وارد شه یه کاربر دیگه با همین نام کاربریif(Session["SessionName"] == null)
{
//Session Does not Exists
}
else
{
//Session Exists
}

baran129
پنج شنبه 28 آبان 1394, 09:38 صبح
session یه متغیر سمت سرور هست اما یه کاربر نمیتونه به session کاربر دیگه دسترسی پیدا کنه که بخواد مثلا مقدارشو بررسی کنه
یعنی بین کاربرا به اشتراک گذاشته نمیشه
اما application یه متغیری هست که همه کاربرا میتونن دسترسی داشته باشن
من به این نتیجه رسیدم که از application استفاده کنم نه از session

baran129
پنج شنبه 28 آبان 1394, 10:04 صبح
متغیر application هم که با بستن مرورگر یا قطع شدن اینترنت از بین نمیره :(

EnKamran
شنبه 30 آبان 1394, 03:39 صبح
شما اصلا متوجه نمیشید بنده و دوستان خدمت شما چی عرض میکنیم، دوست عزیز شما چرا نمیتونی از Session استفاده کنید!؟چه ربطی به اشتراک گذاری Session داره!؟
شما زمانی که کلیک میشه چک میکنید :
if(Session["UserName"] == txtUserName.Text{
Response.Write("شما از جایی دیگر با این نام کاربری لاگین شده اید");}
else{
Session["UserName"] = txtUserName.Text;}

baran129
یک شنبه 01 آذر 1394, 15:37 عصر
دوست عزیز اینی که شما گفتین اولین چیزی بود که من تست کرده بودم که نتیجه نمیده
این session مخصوص همون کاربری هست که میخواد لاگین کنه و چه کاربر دیگه ای لاگین باشه و چه نباشه این کاربر از این شرط میتونه عبور کنه چون مقدار سشن null هست اولش
پس نمیتونه کنترل کنه که کاربر دوم با همین یوزرنیم لاگین بشه
شما خودتون اینو تست کردین و نتیجه گرفتین؟؟!!!!!

aminmousavi
سه شنبه 03 آذر 1394, 02:27 صبح
سلام دوست عزیز . بله به تنهایی نمیتونین از Session استفاده کنید چون Session به هر فردی که سایت شما رو باز میکنه تخصیص داده میشه و دسترسی به بقیه Session ها ندارید تا بررسی کنید قبلا برای کاربری که تازه وارد شده آیا Session ساخته شده یا نه !
تا جایی که بنده اطلاع دارم یا باید از Application استفاده کنید یا از از فیلدهایی که static باشن . فقط باید مراقب باشین که رخداد Session_End که در فایل Global وجود داره حتما اجرا شه ، برای اینکار شما با SessionState رو به InProc تغییر بدید : (در WebConfig)


<sessionState mode="InProc" timeout="1"></sessionState>

baran129
سه شنبه 03 آذر 1394, 14:44 عصر
سلام دوست عزیز . بله به تنهایی نمیتونین از Session استفاده کنید چون Session به هر فردی که سایت شما رو باز میکنه تخصیص داده میشه و دسترسی به بقیه Session ها ندارید تا بررسی کنید قبلا برای کاربری که تازه وارد شده آیا Session ساخته شده یا نه !
تا جایی که بنده اطلاع دارم یا باید از Application استفاده کنید یا از از فیلدهایی که static باشن . فقط باید مراقب باشین که رخداد Session_End که در فایل Global وجود داره حتما اجرا شه ، برای اینکار شما با SessionState رو به InProc تغییر بدید : (در WebConfig)


<sessionState mode="InProc" timeout="1"></sessionState>



سلام
خداروشکر شما فهمیدین مشکل من چیه
دوستان متوجه نمیشدن منم محکوم میکردن که راه حلی که میگن رو نمیفهمم
درسته رفتم سراغ application
فقط application که مثل session نیست که با بسته شدن برنامه از بین بره چطور بگم متغیر applicationخالی شه؟
این session _End که میگین تو فایل Global این کارو برام انجام میده یعنی؟
راستی علت اینکه زمان timeout شدن session رو میگین 1 باشه چیه؟
خیلی ممنون از اینکه جواب دادین

aminmousavi
سه شنبه 03 آذر 1394, 15:26 عصر
سلام . بله Application فقط زمانی که IIS به حالت Stop دربیاد تمامی مقادیر Application خالی میشه . شما باید خودتون مقادیر Application رو در زمان اجرا مدیریت کنید و مقادیر خاصی رو ازش پاک کنید (زمانی که Session بسته میشه) . Session_End زمانی که هر Session ای بسته بشه اجرا میشه و Session_Start هم زمانیکه شما یک Session جدید بسازید اجرا میشه .
اما اگر وضعیت SessionState حالت InProc نباشه و مقدار Timeout بالا باشه ، با بستن مرورگر یا قطع شدن نت Session مدت زیادی باز میمونه . و باعث باگ میشه که کاربر تا مدتی که Session وجود داره نمیتونه دیگه Login کنه . برای همین شما TimeOut رو برابر 1 قرار میدین تا بعد از 1 دقیقه Session شما بسته بشه و اونت Session_End اجرا شه .
شما در Session_End باید مقادیر Application رو مدیریت کنید و Session پاک شده رو از Application پاک کنید .

baran129
سه شنبه 03 آذر 1394, 15:37 عصر
خیلی ممنون آقا امین
توضیحاتون خیلی شفاف و روشن بود
میرم امتحان میکنم
نتیجه گرفتم بهتون میگم حتما

بازم ممنون

baran129
پنج شنبه 05 آذر 1394, 16:39 عصر
سلام . بله Application فقط زمانی که IIS به حالت Stop دربیاد تمامی مقادیر Application خالی میشه . شما باید خودتون مقادیر Application رو در زمان اجرا مدیریت کنید و مقادیر خاصی رو ازش پاک کنید (زمانی که Session بسته میشه) . Session_End زمانی که هر Session ای بسته بشه اجرا میشه و Session_Start هم زمانیکه شما یک Session جدید بسازید اجرا میشه .
اما اگر وضعیت SessionState حالت InProc نباشه و مقدار Timeout بالا باشه ، با بستن مرورگر یا قطع شدن نت Session مدت زیادی باز میمونه . و باعث باگ میشه که کاربر تا مدتی که Session وجود داره نمیتونه دیگه Login کنه . برای همین شما TimeOut رو برابر 1 قرار میدین تا بعد از 1 دقیقه Session شما بسته بشه و اونت Session_End اجرا شه .
شما در Session_End باید مقادیر Application رو مدیریت کنید و Session پاک شده رو از Application پاک کنید .


سلام
من این راه حلی که شما گفتین رو تست کردم
یه مشکلی داره
وقتی زمان timeout شدن session رو 1 دقیقه میذاریم یعنی بعد از 1 دقیقه session بسته میشه و چون تو متد session_end گفتیم application مربوط به فلان کاربر رو خالی کن تا کاربر بعدی با همون نام کاربری بتونه وارد شه پس در هر صورت بعد از اینکه 1 دقیقه از زمان لاگین شدن کاربر اول گذشت کاربر دوم به راحتی میتونه لاگین شه و کاربر دوم از برنامه به صورت خودکار خارج میشه
چون من با هر postback مقدار application رو چک میکنم که آیا کاربر لاگین هست یا نه، پس بعد از 1 دقیقه کاربر اول خارج میشه و میره تو صفحه لاگین
عملا اینجوری کاربر نمیتونه کار کنه دیگه.
اگه جایی اشتباه میکنم بگین لطفا