PDA

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



rahil_2008
چهارشنبه 04 فروردین 1389, 19:17 عصر
سلام دوستان
من یه سایت ساختم و یه صفحه login براش گذاشتم
حالا همه چیز درسته فقط وقتی تو صفحه login کاربر بدون وارد کردن نام کاربری و رمز عبورش
بره تو address bar و نام یه صفحه دیگه را وارد کنه، به اون صفحه دسترسی پیدا می کنه درحالیکه نباید بدون login به اون صفحه دسترسی داشته باشه!
شما می دونید چی کار باید بکنم؟

exlord
چهارشنبه 04 فروردین 1389, 19:57 عصر
با session چک کن که کاربر login شده یا نه اگه نشده .... redirect کن به صفحه Login..........

rahil_2008
چهارشنبه 04 فروردین 1389, 20:11 عصر
این کارو قبلا انجام دادم جواب نمی ده

exlord
چهارشنبه 04 فروردین 1389, 20:15 عصر
من انجام دادم جواب میده........

EnableSessionState="True"؟؟؟؟


protected void Page_Load(object sender, EventArgs e)
{
if ( ! (bool)(Session["UserISLogedIn"]))
Response.Redirect("Login.aspx");
}

rahil_2008
چهارشنبه 04 فروردین 1389, 21:53 عصر
این خط

EnableSessionState="True"
را کجا باید بنویسم؟ تو btnLogin_click نوشتم اصلا EnableSessionState را نمی شناخت؟
از
if ( ! (bool)(Session["UserISLogedIn"]))
هم error می گیره

sahele_sheni
چهارشنبه 04 فروردین 1389, 23:11 عصر
search یه کلمه ی قشنگیه !!!!!

forms authentication

http://msdn.microsoft.com/en-us/library/aa480476.aspx

General-Xenon
پنج شنبه 05 فروردین 1389, 05:15 صبح
سلام....!
اگر صفحاتت توی پوشه خاصی هست...یک Web Config بنداز تو پوشه با این کد.


<?xml version="1.0"?>

<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</configuration>


اگر بعد از Logout کسی تو اون صفحه نباید بره....این کد کمک میکنه تا ببینی یوزر اکتیو چیه...نام کاربر با حروف کوچیک نشون میده


User.Identity.Name.ToLower();


اگر اصلا چک نمی کنه که یوزر لاگین بشه یا نشه......توی Web Config اصلی سایت
باید کد زیرو اصلاح کنی.... Mode خیلی مهمه


<authentication mode="Forms">
<forms loginUrl="./default.aspx" timeout="300" name="LoginName"/>
</authentication>



اگر یک صفحه داشتی که میخوای چک کنه یوزر چی هستش اینو تو Load Event صفحه بنویس....


if (User.Identity.Name.ToLower() == "")
Response.Redirect(login page url)


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


1.Response.Cache.SetNoStore();
2.Response.Cache.SetAllowResponseInBrowserHistory( fa lse);
3.Response.Cache.SetCacheability(HttpCacheability. No Cache);
4.System.Web.Security.FormsAuthentication.SignOut( );
5.System.Web.Security.Roles.DeleteCookie();
6.Session.Clear();
7.System.Web.Security.FormsAuthentication.Redirect To LoginPage();




باز اگر مشکلت حل نشد من برات انجام میدم..:چشمک:

exlord
پنج شنبه 05 فروردین 1389, 10:52 صبح
<%@ Page Language="C#‎‎" AutoEventWireup="true" CodeBehind="Home.aspx.cs" Inherits="WebApp.Home" EnableSessionState="True" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>

</head>
<body>

</body>
</html>


توی فایل global.asax

void Session_Start(object sender, EventArgs e)
{
// Code that runs when a new session is started
Session["UserISLogedIn"] = false;
}

meysampaknahad
پنج شنبه 05 فروردین 1389, 11:36 صبح
سلام
برای این کار راههای مختلفی وجود داره.
من زمانیکه کاربر لوگین می کنه ، یه سشن خاص براش تعریف می کنم که دارای مقدار خاصی هستش.

session["owner"]="user"بعد در صفحات دیگه در متد Page_load چک می کنم ببینم که آیا این سشن مقدار مورد نظر رو داره یا نه


if (session["owner"] != "user")
{
response.redirect("login.aspx");
}به این ترتیب اگه سشن مقدار مورد نظر رو نداشته باشه یعنی لوگین نکرده و به صفحه لوگین هدایت میشه.
در ضمن هنگام خروج هم مقدار فعلی این سشن رو نابود می کنم.
موفق باشید

rahil_2008
پنج شنبه 05 فروردین 1389, 19:23 عصر
سلام دوستان
فکر کنم درست منظورمو بیان نکردم
ببینید من نحوه login کردنو می دونم
دفعه اول هم login درست کار می کنه(یعنی فقط چنانچه کاربر login کنه می تونه به صفحاتم دسترسی داشته باشه ) ولی مشکل بعد از logout و هنگام login مجدد بوجود می آد که اگر کاربر در address bar صفحه login ، آدرس صفحه دیگری از سایت را وارد کند می تواند به آن دستیابد(در حالیکه مجددا login نکرده)؟!

exlord
پنج شنبه 05 فروردین 1389, 20:04 عصر
سلام دوستان
فکر کنم درست منظورمو بیان نکردم
ببینید من نحوه login کردنو می دونم
دفعه اول هم login درست کار می کنه(یعنی فقط چنانچه کاربر login کنه می تونه به صفحاتم دسترسی داشته باشه ) ولی مشکل بعد از logout و هنگام login مجدد بوجود می آد که اگر کاربر در address bar صفحه login ، آدرس صفحه دیگری از سایت را وارد کند می تواند به آن دستیابد(در حالیکه مجددا login نکرده)؟!


public void LogOut()
{
//blah blah blah
Session["UserISLogedIn"] = false;
//blah blah blah
}
شما این کار رو انجام میدی؟؟؟؟؟؟؟؟؟؟؟:عصبانی++:

rahil_2008
پنج شنبه 05 فروردین 1389, 20:33 عصر
قبلا گفته بودی این Session["UserISLogedIn"] = false;
را در global.asax بنویسم منم همون طور که گفته بودی نوشتم اما جواب نگرفتم
حالا لطفا بگو کجا باید این تابع

public void LogOut()
{
//blah blah blah
Session["UserISLogedIn"] = false;
//blah blah blah
}
را بنویسم؟

ضمن اینکه من قبلا از کسی شنیده بودم که برای حل این مشکل باید از cashing استفاده کنم منتها نمی دونم چه جوری؟!

exlord
پنج شنبه 05 فروردین 1389, 20:45 عصر
توی global.asax داره initialize میشه یعنی مقدار دهی اولیه.....
بعد توی متد logout خودت باید بنویسی ....
Session["UserISLogedIn"] = false;
و توی متد login خودت هم بنویس ....
Session["UserISLogedIn"] = true;

rahil_2008
پنج شنبه 05 فروردین 1389, 22:21 عصر
exlord عزیز من کاریو که شما گفتین مو به مو انجام دادم ولی بازم با همون مشکل مواجه شدم
به هرحال ممنون از توجهت

General-Xenon
پنج شنبه 05 فروردین 1389, 23:42 عصر
دوستان عزیز . . .
من براتون کد LOGOUT رو گذاشتم....

دلیل اینکه بعد از LOGOUT می تونی برگردی به همون صفحه اینه که تو کش سیستم ذخیره میشه.....اگر توی پاسخ قبلی ببینی کد LOGOUT را بنویس دیگه این اتفاق نمی افته.....



1.Response.Cache.SetNoStore();
2.Response.Cache.SetAllowResponseInBrowserHistory( false);
3.Response.Cache.SetCacheability(HttpCacheability. NoCache);
4.System.Web.Security.FormsAuthentication.SignOut( );
5.System.Web.Security.Roles.DeleteCookie();
6.Session.Clear();
7.System.Web.Security.FormsAuthentication.Redirect ToLoginPage();


وقتی برای Logout کردن این کد رو بنویسید دیگه کسی نمی تونه برگرده یا از توی آدرس بار به صفحه دیگه بره :چشمک:

rahil_2008
جمعه 06 فروردین 1389, 00:18 صبح
دوستان عزیز . . .
من براتون کد LOGOUT رو گذاشتم....

دلیل اینکه بعد از LOGOUT می تونی برگردی به همون صفحه اینه که تو کش سیستم ذخیره میشه.....اگر توی پاسخ قبلی ببینی کد LOGOUT را بنویس دیگه این اتفاق نمی افته.....


کد:
1.Response.Cache.SetNoStore(); 2.Response.Cache.SetAllowResponseInBrowserHistory( false); 3.Response.Cache.SetCacheability(HttpCacheability. NoCache); 4.System.Web.Security.FormsAuthentication.SignOut( ); 5.System.Web.Security.Roles.DeleteCookie(); 6.Session.Clear(); 7.System.Web.Security.FormsAuthentication.Redirect ToLoginPage();
وقتی برای Logout کردن این کد رو بنویسید دیگه کسی نمی تونه برگرده یا از توی آدرس بار به صفحه دیگه بره :چشمک:
من کد شما رو هم قبلا امتحان کردم
اولا از خط

System.Web.Security.Roles.DeleteCookie();

ایراد گرفت
دوما اینم جواب نداد
البته به نظرم منطقیه که درست کار کنه نمی دونم چرا بازم جواب نمی ده؟!

General-Xenon
جمعه 06 فروردین 1389, 00:49 صبح
من کد شما رو هم قبلا امتحان کردم
اولا از خط

System.Web.Security.Roles.DeleteCookie();

ایراد گرفت
دوما اینم جواب نداد
البته به نظرم منطقیه که درست کار کنه نمی دونم چرا بازم جواب نمی ده؟!


شاید Role نداری... که ایراد می گیره....پاک کن کدشو درست می شه

sahele_sheni
جمعه 06 فروردین 1389, 00:55 صبح
http://barnamenevis.org/forum/showthread.php?t=184445

rahil_2008
جمعه 06 فروردین 1389, 01:39 صبح
عزیزم sahelesheni
شما اصلا صورت سوالو متوجه نشدی
اون راهی که شما می گی رو منم بلدم
جواب سوال من این نیست
خسته نباشید

exlord
جمعه 06 فروردین 1389, 10:44 صبح
الان این کد داره برا من کار میکنه........

ironman
جمعه 06 فروردین 1389, 13:23 عصر
دوست عزیز از این همه بحث در راین موضوع نتیجه ای من گرفتم اینه :
شما برای وارد شدن به صفحه یا صفحات مورد نظر از session استفاده می کنید .... وقتی که کاربر آدرس صفحه رو وارد میکنه ابتدا بررسی میشه که session وجود داره یا نه.... اگه داشت وارد میشه و اگه نه که خیر... تا اینجا مشکلی نیست!!!:لبخند:
هنگام خروج از صفحه session مورد نظر رو پاک کنید (session.remove();) .
حالا اگه کاربر بازم بخواد به صفحه وارد بشه مجدد وجود session بررسی میشه و در نتیجه اگه login نکرده باشه نمیتونه وارد بشه..... . اگه هم وارد بشه صفحه مورد نظر در سیستمش کش شده ولی بهر حال نمیتونه کارهای مدیریتی رو انجام بده .... این مسئله بر میگرده به نقش های که برای یوزر تعریف کردین..

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

reza4359
جمعه 06 فروردین 1389, 13:49 عصر
برو تو web.config و در قسمت<authentication>
<authentication/> این کدها رو قرار بده و ورود همه رو بدون لاگین کردن محدود کن </ "?"= deny user > و </"*"= allow user >

meysampaknahad
جمعه 06 فروردین 1389, 15:14 عصر
سلام
من هم با نتیجه گیری های ironman موافقم . پس از خروج از سایت ، صفحات بازدیدشده در کش سیستم باقی می مونه و کاربر می تونه با نوشتن آدرس این صفحات در قسمت آدرس بار ، به اون صفحات مراجعه کنه ولی چون پس از خروج کاربر ، Session از بین میره ، اگر بخواد هر نوع کاری روی این صفحات انجام بده ، چون session از بین رفته ، صفحه مجدداً از نظر مقادیر Session بررسی میشه و به صفحه لوگین هدایت میشه.
موفق باشید

Peyman.Gh
جمعه 06 فروردین 1389, 15:15 عصر
http://barnamenevis.org/forum/showpost.php?p=879310&postcount=4

rahil_2008
جمعه 06 فروردین 1389, 16:06 عصر
من با ironman و meysampaknahad موافقم و ممنونم
و خیلی خوشحالم که بالاخره یکی منظورمو متوجه شد
حالا شما راهی سراغ دارید که بشه اون صفحه را از cashe سیستم کاربر هم پاک کرد که حتی به ظاهرش هم دسترسی نداشته باشه؟

alihassanabadi
جمعه 06 فروردین 1389, 16:40 عصر
حالا شما راهی سراغ دارید که بشه اون صفحه را از cashe سیستم کاربر هم پاک کرد که حتی به ظاهرش هم دسترسی نداشته باشه؟


من کد شما رو هم قبلا امتحان کردم
اولا از خط

کد:
System.Web.Security.Roles.DeleteCookie();
ایراد گرفت
دوما اینم جواب نداد
البته به نظرم منطقیه که درست کار کنه نمی دونم چرا بازم جواب نمی ده؟!

درود به همه
دوست عزیز منم این مشکل شما رو خیلی وقت پیش داشتم
حالا برای فرار از این مشکل شما باید کش رو پاک کنید یا انقضاش رو برابر زمان فعلی بزاری


Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now);

من این کد رو نوشتم حل شد
شما بعد از login بیا یه بلیط به کاربرت بده که مقدارش برابر یک باشه یا زمانی که Session شروع میشه داخل Global بسازش و مقدارش رو برابر 0 کن ,بعد از لاگین یکش کن


session.Add("ticket","1");

حالا داخل هر pageload این کد رو بنویس


Response.Cache.SetNoStore();
Response.Cache.SetExpires(DateTime.Now);
try
{
if (Session["ticket"].ToString().Trim() != "1")
{
Response.Redirect("login.aspx");
}
}
catch
{
Response.Redirect("login.aspx");
}


خب مشخصه اگه کاربر login نکرده باشه در نتیجه بلیطی هم وجود نداره پس داخل بلاک try خطا رخ میده و
بلاک Catch اجرا میشه و به login برمیگرده و اگر هم بلیط مخالف یک باشه دوباره به login.aspx برمیگرده
برای خروج هم سشن ticket رو برابر 0 کن به این صورت که یا یه صفحه ی SignOut بساز و درون PageLoad ش
سشن رو صفر کن
یا داخل LogOut() مربوط به فایل Global:خجالت:
با تشکر

rahil_2008
جمعه 06 فروردین 1389, 22:19 عصر
حل شد
از توجه همه دوستان ممنون
بخصوص alihassanabadi