PDA

View Full Version : حرفه ای: عدم لاگین کاربر از دو سیستم



rezaei_y
یک شنبه 01 بهمن 1391, 10:43 صبح
با سلام به دوستان برنامه نویس

من یه پروژه سی شارپ دارم که بانک اطلاعاتیش توی هاست قرار داره و توسط وب سرویس باهاش در ارتباط هستم

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

خوب مسلما باید برای هر کاربر یک فیلد در نظر گرفته بشه که اگر لاگین کرد true بشه و زمانی که خارج شد false بشه

من این کار رو انجام دادم اما فرض کنید که کاربر لاگین کرد و وارد شد در این بین سیستم به هر دلیلی خاموش شد با توجه به اینکه فیلد true شده کاربر دیگه نمیتونه وارد نرم افزار شه

برای حل این مشکل چه راه حلی به ذهنتون میرسه

ممنون میشم

sgn2006
یک شنبه 01 بهمن 1391, 11:12 صبح
سلام چیزی که به عقل ناقص من می رسه اینه :

یه جدول طراحی کنی که وقتی کاربر وارد برنامه شد کد کاربر و ip سیستم داخل اون بره و زمان خروج از برنامه مد کاربر رو از جدول پاک کنه و اگر از سیستم دیگه ای خواست وارد بشه چک کنه ببینه اگر اون کاربر با همون ip می خوارد وارد بشه مشکلی نداره در غیر این صورت چون ip متفاوته نمی تونه وارد بشه

حالا حل مسئله : اگر وسط کار کردن خاموش شد یا ریست شد .... وقتی با همون سیستم می خواد وارد برنامه بشه توی اون جدول چک کنه ببینه این کاربر با همون ip وارد شده یا خیر ، اگر بود اشکالی نداره و می تونه وارد بشه اما اگر ip ها متفاوت بود نتونه وارد بشه...
نکته : موقع خروج از برنامه اطلاعات کاربر حتما از اون جدول پاک بشه .
البته این کار زمانی جواب می ده که IPها دستی تنظیم بشه اگر با DHCP بود می تونی با ComputerName این کار رو انجام بدی

اگر به این نتیجه رسیی که این کار رو انجام بدی می تونی زمان ورود ، و خیلی اطلاعات دیگر رو وارد جدول کنی که یه شبه log از کاربر داشته باشی

موفق باشی

rezaei_y
یک شنبه 01 بهمن 1391, 11:19 صبح
حالا حل مسئله : اگر وسط کار کردن خاموش شد یا ریست شد .... وقتی با همون سیستم می خواد وارد برنامه بشه توی اون جدول چک کنه ببینه این کاربر با همون ip وارد شده یا خیر ، اگر بود اشکالی نداره و می تونه وارد بشه اما اگر ip ها متفاوت بود نتونه وارد بشه...

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

بازم ممنون بابت راهنمایی تون

sgn2006
یک شنبه 01 بهمن 1391, 12:03 عصر
باز هم سلام
راهی که دارم نمی دونم چقدر بدرت بخوره و چه قدر دیتابیست رو ببره زیر باز تغییر ولی گفتنش ضرر نداره

از user های sql باید استفاده کنی خود sql تشخیص می ده که در حال حاضر کاربر login هست یا خیر
با استفاده از دستور زیر می تونی بفهمی کاربر وجود دارد یا خیر

SELECTCOUNT(*)FROMsys.dm_exec_sessionsWHERE is_user_process = 1 AND original_login_name='SGN'

نام کاربری SGN رو در دیتا بیس تعریف کردم

rezaei_y
یک شنبه 01 بهمن 1391, 12:19 عصر
زمان time_out اینجا تاثیر نداره؟

AmirGhasemi
یک شنبه 01 بهمن 1391, 12:34 عصر
سلام من هم خيلي وقته دنبال چنين كدي هستم
ببينيد يوزر sql نمي تونه كمك كنه چون اصلا با يوزر sql شخصي كانكنت نمي شه كه
در ضمن طبق راهي كه دوستا ن گفتن هنوز مشكلي به نام خروج نا بهنگام وجود داره

sgn2006
یک شنبه 01 بهمن 1391, 12:48 عصر
منظورت از زمان Time out چیه ؟ اگر به هر دلیلی کاربر از برنامه خارج شد SQL متوجه می شه و دیگر در جدول sys.dm_exec_sessions دیتایی وجود نداره ... در غیر این صورت تا زمانی که کاربر خودش نیاد بیرون این اطلاعات در جدول
sys.dm_exec_sessions باقی می مونه...

در مورد صحبت دوستتمون Amir Ghasemi درباره کانکت شدن user با sql : این کار امکان پذیر ه من الان یه نرم افزار دارم که با user هایی که در Sql هستند کار می کنه...

وقتی user تعریف می شه اطلاعاتش در جدول sys.sysusers ثبت می شه و خودت یه جدول userAccount می سازی و uid مربوط به جدول sys.sysusers رو می ریزی توی جدول userAccount و بعد با یک View راحت به هرچیزی که می خوای دسترسی داری مثلا user مربوط به sql یا نام کاربر و ...

موفق باشی

plus
یک شنبه 01 بهمن 1391, 13:51 عصر
منظورت از زمان Time out چیه ؟ اگر به هر دلیلی کاربر از برنامه خارج شد SQL متوجه می شه و دیگر در جدول sys.dm_exec_sessions دیتایی وجود نداره ... در غیر این صورت تا زمانی که کاربر خودش نیاد بیرون این اطلاعات در جدول
sys.dm_exec_sessions باقی می مونه...

در مورد صحبت دوستتمون Amir Ghasemi درباره کانکت شدن user با sql : این کار امکان پذیر ه من الان یه نرم افزار دارم که با user هایی که در Sql هستند کار می کنه...

وقتی user تعریف می شه اطلاعاتش در جدول sys.sysusers ثبت می شه و خودت یه جدول userAccount می سازی و uid مربوط به جدول sys.sysusers رو می ریزی توی جدول userAccount و بعد با یک View راحت به هرچیزی که می خوای دسترسی داری مثلا user مربوط به sql یا نام کاربر و ...

موفق باشی

دوست عزیز کاربر به صورت غیر مستقیم از طریق وب سرویس از دیتابیس Query میگیره چطور با خارج شدن ناگهانی از برنامه SQL متوجه بشه.
----------
مشکلی که هست، موضوع شناخته شده ای هست. یک راه حلش، تکمیل روشیه که خودتون گفتین.وقتی کاربری لاگین میکنه، ID اون به همراه زمان لاگینش و یک مشخصه یکتای سیستم (مثلا IP) سمت سرور ذخیره میشه.نرم افزار کلاینت کاربر، طی یک زمان مشخصی، مثلا هر 30 ثانیه یکبار، به سرور اعلام حضور میکنه (مثلا از طریق یک متد در وب سرویستون).سرور وقتی اعلام حضور کاربر رو میگیره، زمان رو بجای زمان لاگین اون ID قرار میده تا همیشه زمان آخرین اعلام حضور کاربر رو داشته باشه.
خوب، حالا اگه در اون جدولی که اطلاعات کاربر لاگین شده وجود داره، زمان ذخیره شده از 30 ثانیه بیشتر باشه، به این معنیه که نرم افزار سمت کاربر به هر دلیلی نتونسته اعلام حضور کنه و Time Out شده حساب میشه.
خوب، با این سیستم، وقتی یک کاربر اقدام به لاگین میکنه، باید بررسی بشه که اولا قبلا رکوردی براش ثبت شده یا نه.اگه ثبت نشده بود که خوب لاگین میشه و یک رکورد همونطور که گفتم ثبت میشه.اگه ثبت شده، تاریخ آخرین اعلام حضورش بررسی میشه، اگه مربوط به 30 ثانیه پیش یا کمتر بود، به این معنیه که اون کاربر در سیستم دیگه ای هنوز فعال هست و اجازه لاگین دوباره داده نمیشه.اگه بیشتر بود به این معنیه که ارتباط قبلی TimeOut شده.رکورد مربوط به ارتباط قبلی پاک میشه و رکورد جدیدی برای ارتباط جدید ایجاد میشه و کاربر با موفقیت لاگین میشه...