Parsi Coders
مشکلاتي با تشخيص هويت - نسخه قابل چاپ

+- Parsi Coders (http://parsicoders.com)
+-- انجمن: Web Development and Design (http://parsicoders.com/forumdisplay.php?fid=47)
+--- انجمن: ASP, ASP.NET (http://parsicoders.com/forumdisplay.php?fid=49)
+--- موضوع: مشکلاتي با تشخيص هويت (/showthread.php?tid=2904)



مشکلاتي با تشخيص هويت - aspdotnet - 11-22-2012

سلام.

مسئله اينه فرضاً يه کاربر با اسم کاربري a وارد ميشه بدون اينکه خروج رو بزنه يه نام کاربري ديگه رو در لوگين وارد ميکنه و مي تونه وارد بشه به من گفتن نبايد اين اتفاق بيفته.
در واقع من مي خوام اگه کاربر هنوز خارج نشده بود و خواست با يه نام کاربري ديگه لوگين کنه بهش پيغام بده که ابتدا خارج شويد و سپس با نام کاربري جديد لوگين کنيد.

ممنون ميشم راهنمايي کنيد چطور ميشه اين مشکل رو حل کرد؟
يه مسئله ديگه اينه که وقتي کاربر خروج رو زد و دکمه back براوزر رو مي زنه نمي دونم چرا وقتي بار اول بک مي زنه اون رو به عنوان کاربر ميهمان تشخيص مي ده ولي بار دوم با نام کاربريش بهش خوش آمد ميگه که اينم لطف کنيد بگيد چه کار کنم تا اين اتفاق نيفته؟
کدهاي دکمه لوگين
کد:
if (GetMemberAuthenticate(txt_uname.Text, FormsAuthentication.HashPasswordForStoringInConfigFile(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("AdminPage.aspx");
                }  
            }

            Response.Redirect(FormsAuthentication.GetRedirectUrl(txt_uname.Text, chk_rememberme.Checked));
        }
        else
        {
            lbl_login.Visible = true;
        }
کدهايي که در global.asax نوشتم
کد:
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName.ToString()];
        if (authCookie != null)
        {
            FormsAuthenticationTicket MyTicket;
            MyTicket = FormsAuthentication.Decrypt(authCookie.Value);
            FormsIdentity MyIdentity = new FormsIdentity(MyTicket);
            GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyTicket.UserData.Split(new char[] { ',' }));
            Context.User = MyPrincipal;
        }
و کدي که در web.config نوشتم و به اين مسئله مربوط ميشه
کد:
<authentication mode="Forms">
            <forms loginUrl="Default.aspx" defaultUrl="~/"></forms>
        </authentication>
ممنون.


RE: مشکلاتي با تشخيص هويت - aspdotnet - 11-22-2012

واقعاً ديگه موندم چيکار کنم. رفتم با کنترلهاي آماده خود Asp.net امتحان کردم ديدم هر دو مشکل چه مشکل Back براوزر و چه ورود يه فرد با نام کاربري جديد در حالي که خروج رو نزده و صفحه رو نبسته اونجا هم وجود داره.

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

خوب حالا چي کار ميشه کرد؟


RE: مشکلاتي با تشخيص هويت - Amin_Mansouri - 11-22-2012

درودالان با موبایلم
سادست
وقتی دکمه خروج رو زد کوکی پاک کن


RE: مشکلاتي با تشخيص هويت - aspdotnet - 11-22-2012

سلام.
لطفاً پيام خصوصي که براتون فرستادم رو جواب بديد خيلي عجله دارم.
بعداً ميام سراغ اين سوال تشخيص هويت.

نقل قول: وقتی دکمه خروج رو زد کوکی پاک کن
مسئله اينه که کاربر a که وارد ميشه بدون اينکه خروج رو بزنه کاربر 2 مي تونه وارد بشه و اين رو از من ايراد گرفتن.


RE: مشکلاتي با تشخيص هويت - aspdotnet - 11-23-2012

براي سوال اولي اومدم يه صفحه ايجاد کردم و دکمه خروج رو در اون گذاشتم.
بعد اين کد رو به رويداد کليک دکمه ورود اضافه کردم
کد:
if (Page.User.Identity.IsAuthenticated)
        {
            Response.Redirect("signout.aspx");
        }
مشکل دکمه back رو هم خيلي به حلش نزديک شدم ولي هنوز به جواب قطعي نرسيدم.


RE: مشکلاتي با تشخيص هويت - Amin_Mansouri - 11-24-2012

ببین
وارد این فروم میشی وقتی یوزر و پسووردو میزنی چرا کس دیگه نمیتونه لاگین کنه؟
کجا ذخیره میشه؟
خوب اینها تو کوکی ذخیره میشه
مشکل شما با کوکیه
باید رو کوکی تشخیص بدی
اینها ببین
http://davestechshop.net/FormsAuthCookiesAndSubdomainNames2
http://www.codeproject.com/Articles/13872/Form-authentication-and-authorization-in-ASP-NET


RE: مشکلاتي با تشخيص هويت - aspdotnet - 11-25-2012

ممنون از راهنمايي خوبتون. با توجه به صحبت شما يه راه ديگه پيدا کردم که فکر مي کنم بهتر از قبليه باشه.
فکر کردم هر چي هست در اين دکمه لوگينه ديگه
خوب اينجا کوکي ايجاد ميشه
خوب اين کدهاي دکمه لوگين
کد:
protected void btn_login_Click(object sender, EventArgs e)
    {
        //if (Page.User.Identity.IsAuthenticated)
       // {

            //Response.Redirect("LogOut.aspx");
       // }
        if (GetMemberAuthenticate(txt_uname.Text, FormsAuthentication.HashPasswordForStoringInConfigFile(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("AdminPage.aspx");
                }  
            }

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


خوب وقتي با نام کاربري جديد مي خواد وارد شه
دوباره يه کوکي با همون نام ايجاد ميشه و فکر مي کنم replace ميشه
که اون اتفاق مي افته

گفتم چه جوري نزارم وقتي يکي هنوز خارج نشده
و دوباره دکمه لوگين رو ميزنه کوکي قبلي replace بشه؟

اومدم اين طوري نوشتم در رويداد لوگين
کد:
protected void btn_login_Click(object sender, EventArgs e)
    {
        //if (Page.User.Identity.IsAuthenticated)
        //{

        //    Response.Redirect("LogOut.aspx");
        //}
        if (!Page.User.Identity.IsAuthenticated)
        {
        if (GetMemberAuthenticate(txt_uname.Text, FormsAuthentication.HashPasswordForStoringInConfigFile(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("AdminPage.aspx");
                    }
                }

                Response.Redirect(FormsAuthentication.GetRedirectUrl(txt_uname.Text, chk_rememberme.Checked));
            }
            else
            {
                lbl_login.Visible = true;
            }
        }
        else
        {
            lbl_login.Visible = true;
            lbl_login.Text = "کاربر محترم شما هم اکنون با نام کاربري ديگري وارد شده ايد. لطفاً ابتدا خارج شويد";
        }
    }
از نظر من که مسئله حل شده
حالا اگه شما کار من رو تأييد نمي کنيد لطفاً در ميون بزاريد.
پاورقي:
من فکر مي کردم اين قضيه حل شده و امروز اومدم يه سوال ديگه بپرسم که اين جواب رو ديدم و متأسفانه الآن وقت ندارم سر اين موضوع وقت زيادي بزارم
و برم لينکاي جديد اونم انگليسي بخونم.
اگه امکان داره براتون روي همين کدا نظر بديد و بگيد آيا اين کار جديد من رو تأييد مي کنيد؟
فکر کنم شما با موبايل جواب مي ديد و خودم مي دونم با موبايل نوشتن چقدر سخته بنابراين ازتون انتظار ندارم حتماً جواب بديد


RE: مشکلاتي با تشخيص هويت - Amin_Mansouri - 11-25-2012

درود
این روشم خوبه
چون وقت کمتری دارید اینو تایید میکنم.
گفتم که مشکلتون کوکی بود , البته دیگه مشکلتون حل شد سعی کنید روی کوکی کار کردنش زیاد سورس و مقاله نگاه کنید.