View Full Version : سوال: مشکل در لاگ گرفتن ورود و خروج کاربران
mehrdad201
دوشنبه 29 آذر 1389, 14:32 عصر
با عرض سلام خدمت همه دوستان و اساتید
من یه مشکل و معمایی برام پیش اومده. خیلی هم در موردش سرچ کردم اما راه حلی پیدا نکردم.
مساله اینجاست که ما برای یک سایت از asp.net membership استفاده کردیم.
مدیر سایت دوست داره که از ورود و خروج کاربرها لاگ داشته باشه. اینطوری بفهمه که چه یوزرهایی بیشتر لاگین میکنند و چه زمانیهایی
برای لاگ گرفتن از زمان ورود مشکلی نیست. تو همون رویداد logged_in از کنترل asp.net:login میشه این کار رو کرد.
تو این رویداد تابع لاگ طراحی شده رو فراخوانی کرده و یوزرنیم کاربر لاگین شده رو ب عنوان پارامتر براش ارسال میکنیم.
وقتی هم یوزر خودش ساین اوت میکنه مشکلی نیست. باز تابع لاگ رو فراخوانی کرده و یوزرنیم رو بهش پاس میکنیم.
مشکل مال زمانی است که یوزر بروزر رو رها کرده و میره. در این حالت بعد از مدتی سشن تایم اوت فراخوانی میشه و اعتبار لاگین یوزر از بین میره. من میخوام تو این سشن تایم اوت هم تابع لاگ رو فرخوانی کنم. اما متاسفانه اینجا به یوزر نیم کاربر دسترسی نداریم. یعنی به نظر میرسه httpcontext ما مقدار null رو برمیگردونه.
میخواستم ببینم کسی از دوستان میدونه چه راه حلی میشه برای این مشکل به کار برد ؟ یه جوری که ما زمان رویداد سشن تایم اوت بتونیم یوزر نیم کاربر رو ثبت کنیم.
بعضی جاها دیدم کوکی استفاده کرده بودند. اما خب فکر میکنم اعتبار 100 درصد نداره. شایدم اشتباه کنم.
خواهشا راهنماییم کنید :)
prankster
دوشنبه 29 آذر 1389, 22:17 عصر
httpcontext اشاره گر به موجودیتی است که اطلاعات مربوط به یک request به وب سرور را در خود دارد، در هنگام time-out شدن session درخواستی از جانب client به سرور ارسال نشده است و بنابریان مقدار httpcontext برابر null است.
در هر حال در یک HttpApplication همواره می توان کنترل ورودی-خروجی یا session یا شروع و پایان application را با استفاده از event های متناظر کنترل کرد. ساده ترین راه حل برای شما استفاده از وقفه Session_End در فایل Global.asax است، Global.asax کلاسی است که از application جاری ارث بری دارد و کنترل کلیه عملیات ورودی-خروجی application درون آن انجام می شود.
کافی است دسترسی به session مورد نظر را در وقفه Session_End از کلاس Global.asax انجام دهید، بعد از session_end دیگر دستری به session امکان پذیر نیست و session از بین می شود. مثلا:
protected void Session_End(object sender, EventArgs e)
{
string username = this.Session["username"] as string;
// save log
}
mehrdad201
سه شنبه 30 آذر 1389, 01:45 صبح
ضمن تشکر از شما
ایا مطمئنید که در session_end هنوز هم به سشن میشه دسترسی داشت ؟!!؟ اخه من همش با null برخورد کردم. حالا باز بررسی میکنم. شاید من جایی از کار اشتباهی داشتم.
یک سوال : در این مورد حتما باید مقدار تایم اوت session_end و membership_form برابر باشه. درسته ؟
prankster
سه شنبه 30 آذر 1389, 23:09 عصر
بله در session_endبه session دسترسی دارید، البته نه از طریق context از طریق دسترسی مستقیم به session در کلاس application
session timeout و authenticate timeout می توانند متفاوت باشند، بهتر است که session timeout حداقل مساوی و یا بیشتر از authenticate timeout باشد ولی در وقفه session_start از کلاس Global.asax همیشه authenticate بودن user را چک کنید و session را در صورت authenticate بودن مقدار دهی کنید، در این صورت فقط یک مکان از برنامه است که session را مقدار دهی می کند و تا هنگام authenticate timeout شدن session مقدار دارد
mehrdad201
چهارشنبه 01 دی 1389, 14:41 عصر
تشکر
یک سوال: اگه مقدار authenticate timeout کمتر از session time out باشه یه مشکل پیش نمیاد.
یوزر قبل از اینکه سشن تایم اوت اتفاق بیفته لاگ اوت میشه. اونوقت سشن تایم اوت دقیقا زمانی که تایم اوت یوزر تموم میشه فراخوانی نمیشه !!!
یه مقدار سر این قضیه گیج شدم.
البته من سشن رو دقیقا یک بار مقدار دهی میکنم. اونم در ایونت logged_in کنترل لاگین هست. به نظر شما این حالتی که من استفاده کردم با مقدار دهی در session_start فرق داره ؟
یه مساله دیگه.
در سشن تایم اون ایا میشه با ابجکت request دسترسی داشت ؟ به منظور دستیابی به مقادیری مثل IP یا userAgent
prankster
چهارشنبه 01 دی 1389, 23:40 عصر
یوزر قبل از اینکه سشن تایم اوت اتفاق بیفته لاگ اوت میشه. اونوقت سشن تایم اوت دقیقا زمانی که تایم اوت یوزر تموم میشه فراخوانی نمیشه !!!دقیقا مشکلی است که هنگام mix کردن روش membership و session پیش می آید و اصولا این دو متد با هم match نیستند، time out شدن session کاملا مجزا از authenticate timeout است.
authenticate timeout به این معنی است که کاربر از نظر برنامه valid نیست و نیاز به login مجدد دارد، در صورتی که session timeout مشخص می کند که ارتباط کاربر با سرور قطع شده است. زمان بندی timeout ها بسته به کاربرد برنامه می تواند یکسان و یا متفاوت باشد. در صورتی که session را در وقفه logged_in مقدار دهی می کنید بهتر است در همان وقفه و قبل از مقدار دهی session، session را abandon کنید. در این صورت مطمئن خواهید بود که حتی در صورتی که session timeout اتفاق نیفتاده است، به صورت دستی session را timeout کرده اید. در حالتی هم که کاربر برنامه را رها کرده و یا مرورگر خود را بسته است، session timeout اتفاق افتاده و logging مورد نظر انجام شده است. بهتر است در مورد برنامه شما session timeout بیشتر از authenticate timeout باشد، در غیر این صورت همانطور که قبلا گفتم باید در Session_Start همیشه authenticate بودن کاربر را به صورت زیر چک کنید:
if (this.User.Identity.IsAuthenticated) Session["username"] = "blah blah";
در سشن تایم اون ایا میشه با ابجکت request دسترسی داشت خیر! هنگام session_end به برنامه request خاصی از جانب کاربر داده نشده است، بنابراین context هم که در بر گیرنده request و response است مقدار null دارد. بهتر است در صورت نیاز به اطلاعات اضافه مانند IP یا user agent مرورگر کاربر، آنها را به همراه نام کاربر در session ذخیره کنید تا هنگام session_end به آن دسترسی داشته باشد
mehrdad201
پنج شنبه 02 دی 1389, 00:16 صبح
ممنون
با این حساب اگه در برنامه از از membership مایکروسافت استفاده میکنیم. اگه session رو غیر فعال کنیم (با این فرض که نیازی به لاگ گرفتن و استفاده از سشن نباشه) مشکلی پیش نخواهد امد.
درسته ؟!؟
prankster
پنج شنبه 02 دی 1389, 09:42 صبح
احتمالا نباید مشکلی پیش بیاید چون دو مقوله کاملا جدا هستند...
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.