View Full Version : سوال: آیا کد زیر برای کنترل اینکه مدیر وارد صفحه مدیریت شده یا نه ، خوبه یا بد
malloc
جمعه 08 دی 1391, 23:26 عصر
مشکل هنوز برطرف نشده دوستان لطفا نظر بدید . پست اول و پست 12 رو نیگاه کنید .
سلام دوستان .
من برای کنترل اینکه کسی از طرق آدرس بار وارد صفحه مدیریت نشه دوتا تابع زیر و نوشتم . میشه یه نظر بدید که خوبه یا نه ؟؟؟
private bool ChkAdmin()
{
try
{
if (Session["username"].ToString() != string.Empty && Session["UserType"].ToString() == "2")
return true;
else if (Request.Cookies["NDT"].Values["username"].ToString() != string.Empty)
{
if (chkCookieValid())
return true;
return false;
}
return false;
}
catch
{
try
{
if (Request.Cookies["NDT"].Values["username"].ToString() != string.Empty)
{
if (chkCookieValid())
return true;
return false;
}
else
return false;
}
catch { return false; }
}
}
private bool chkCookieValid()
{
try
{
Linq.NDT_TabelsDataContext Cookie = new Linq.NDT_TabelsDataContext();
var j = from k in Cookie.Users where (k.UserName == Request.Cookies["NDT"].Values["username"].ToString()) && (k.Password == Request.Cookies["NDT"].Values["password"].ToString()) select k;
if (j.First().usertype.ToString() == "2")
return true;
return false;
}
catch { return false; }
}
ضمنا اینم بگم که هم باید session رو چک کنم و هم باید cookie رو تست کنم.
اما بنظرم اگه بخوام تو هرصفحه مدیریت این 40 خط کد رو بنویسم زایع میشه؟؟؟
نظر بدید لطفا
aspismylove
جمعه 08 دی 1391, 23:47 عصر
اما بنظرم اگه بخوام تو هرصفحه مدیریت این 40 خط کد رو بنویسم زایع میشه؟؟؟
میشه به من بگی چرا باید توی هر 40 صفحه این کد و بنویسی ؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ :متفکر:
نگو که از Master Page استفاده نمیکنی !!!!!!!!!!!!!!!!!!!!!!
malloc
جمعه 08 دی 1391, 23:49 عصر
چرا از مستر پیج استفاده میکنم .................:قهقهه:
وایسا تست کنم
:عصبانی++:نه داداشی اصلا نمیشه اونو توصفحه مستر نوشت چون من میخوام وقتی حاصل اون توایع false بود به صفحه Home من بره . اما اگه تو مستر پیچ بنویسم (حتی با !ispostback) بازم میوفته تو حلقه تکرار هی همون کدها تکرار میشه و میره تو صفحه home بازم همونا اجرا میشن و .....
malloc
شنبه 09 دی 1391, 00:18 صبح
یعنی کلا من بجز تون دوتا تابعی که بالا نوشتم از اینا هم استفاده میکنم :
page_Load
if (!IsPostBack)
{
if (ChkAdmin() == false)
{
setLogin(false);
Response.Redirect("~/Default.aspx");
}
else
{
setLogin(true);
}
}
private void setLogin(bool Access)
{
if (Access)
{
PnlLogin.Visible = false;
PnlWelCome.Visible = true;
string ss = this.Page.Title;
}
else
{
PnlLogin.Visible = true;
PnlWelCome.Visible = false;
string ss = this.Page.Title;
}
}
حالا شما هرجور میخوای حساب کن . این کار پروژه رو میندازه تو حلقه تکرار / اگه راه دیگه ای کسی داره بگه لطفا
aspismylove
شنبه 09 دی 1391, 00:29 صبح
ببین من فقط قاعده ی کلی کار و میگم (جسارت نباشه سادس و حتما هم میدونم بلدی) :افسرده:
1- شما توی دکمه لاگین فقط بیا نام کاربری و رمز عبور و چک کن و بعد هم آی دی اون کاربر رو توی یک سشن نگهداری کن (اگه نام کاربری و رمز عبور درست بود ) (این تا اینجا)
2- بیا و کوکی رو چک کن (این هم تا اینجا)
3- بیا ROLE رو هم چک کن و بریز توی یک سشن دیگه (کاربر معمولی یا مدیر یا ...) (این هم تا اینجا)
و بعد از همه این کارها که کردی :
توی Master Page LOAD صفحه مدیریتت بیا و این ها رو فقط چک کن :
1- آیا طرف کاربر هستش ؟ (از طریق سشنی که آی دی کاربر رو ریختی توش)
2- از طریق سشن ROLE ، چک کن که آیا طرف مدیر هستش یا نه ؟؟؟ اگه بود اجازه ورود بده و در غیز اینصورت هدایت بشه به صفحه مثلا : User.aspx
3- اگه مدیر بود کوکی چک بشه
......
به همین سادگی به همین خوشمزگی :چشمک:
موفق باشید
actros
شنبه 09 دی 1391, 01:42 صبح
بهترین راه حل اینه:
فرضیات ما :
1-دو تا Role به نام های admin و hamkar داری
2- پوشه ای به نام admin تو ریشه سایت داری که میخای فقط یوزرهای با Role ادمین وارد شن
مراحل کار:
1- افزودن این کد به فایل web.config (آخر فایل قبل از تگ بسته شونده </configuration> بذارش)
ترتیب قرارگیری role ها بسیار مهمه. هر role که نمیخای وارد بخش ادمین شه (در اینجا Hamkar) رو حتما باید deny اش کنی.نکنی میتونه وارد شه :لبخندساده:
<location path="Admin">
<system.web>
<authorization>
<allow roles="Admin" />
<deny roles="Hamkar" />
<deny users="?" />
</authorization>
</system.web>
</location>
2- تو رویداد _LoggedIn کنترل لاگین صفحه لاگین چک کن:
protected void Login1_LoggedIn(object sender, System.EventArgs e)
{
if (User.IsInRole("Admin")) {
Server.Transfer("Default.aspx");
}
}
3- این کد رو به masterpage ات اضافه کن (نام صفحات رو مطابق سایتت عوض کن ولی کلیتش همینه)
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
<a href="Login.aspx">(ورود به سایت)</a>
</AnonymousTemplate>
<LoggedInTemplate>
<asp:LoginName ID="LoginName1" runat="server" FormatString="خوش آمدید {0}" Font-Bold="True" />
(<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutPageUrl="~/Home.aspx" LogoutText="خروج" />)
</LoggedInTemplate>
<RoleGroups>
<asp:RoleGroup Roles="Admin">
<ContentTemplate>
<asp:LoginName ID="LoginName1" runat="server" FormatString="خوش آمدید {0}" Font-Bold="True" />
<a href="Admin/Default.aspx">ورود به پنل مدیریت</a> | (<asp:LoginStatus ID="LoginStatus1"
runat="server" LogoutText="خروج" LogoutPageUrl="~/Default.aspx" LogoutAction="Redirect" />)
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
</asp:LoginView>
این طوری هر کس هر وقت صفحه ای از پوشه ادمین رو درخواست کنه به صفحه لاگین هدایت میشه و اگه تو role ادمین نباشه نمیتونه وارد شه :دی
مشکلی بود بپرس
malloc
شنبه 09 دی 1391, 02:01 صبح
دوست عزیز این روشی که شما گفتی خیلی هم خوبه اما من الان انتهای پروژه هستم و از ابزارهای Login خود asp استفاده نکردم و خودم ابزار text و .... گذاشتم و نمیتونم از روش شما برم.
سناریویی رو هم که دوستمونaspismylove (http://barnamenevis.org/member.php?147819-aspismylove) گفت رو نتونستم پیاده کنم.
aspismylove
شنبه 09 دی 1391, 08:13 صبح
2- پوشه ای به نام admin تو ریشه سایت داری که میخای فقط یوزرهای با Role ادمین وارد شن
چه جالب !!!!!!!!!!!
شما میشه به من بگید که : اگه 20 تا ROLE داشته باشی میای و 20 تا پوشه درست میکنی ؟؟؟؟؟!؟!؟؟!؟!؟!؟
این کار برنامه نویسای نوپا هستش داداش گلم ، سطح کارت و بالا بیار ... :چشمک:
actros
شنبه 09 دی 1391, 09:23 صبح
چه جالب !!!!!!!!!!!
شما میشه به من بگید که : اگه 20 تا ROLE داشته باشی میای و 20 تا پوشه درست میکنی ؟؟؟؟؟!؟!؟؟!؟!؟!؟
این کار برنامه نویسای نوپا هستش داداش گلم ، سطح کارت و بالا بیار ... :چشمک:
منم نوپام عزیزم.میخام سطح کارم رو بیارم بالا نمی تونم درتوانم نیست :دی
چون واسه ادمین پوشه ساختم و اشاره ای به Role همکار نکردم تصور کردی برا اونم میخام یه پوشه بسازم؟
اینطور نیست.من نمونه مثال سایت یکی از کارام رو زدم که Role همکار هیچ نقشی تو مدیریت نداره و فقط موقع دانلود مطلب نقشش چک میشه
اگه قرار باشه همکار یا 10 تا نقش دیگه به بخشی از منو مدیریت دسترسی داشته باشن خیلی ساده میشه منوهایی قابل دسترسیشونو تو RoleGroup مخصوص تو loginView گذاشت
برای اینکه طرف نتونه با وارد کردن آدرس صفحات ممنوعه واردشون بشه(برفرض که اسم صفحات رو بدونه) اول صفحه شرط میذاریم که چه Role های میتونن به این صفحه دسترسی داشته باشن
در ضمن من اگه واقعا بخام سایتی چنان بزرگ داشته باشم که 20 تا Role نیاز داشته باشه یه سرچی میکنم و احیانا راه حل های بهتری پیدا می کنم
حالا میشه شما بگی برا مدیریت 20 تا Role به چه صورت عمل میکنی؟؟
اگه میشه یه نمونه کار برام بفرست.یه سایت ساده که مثلا 5-4 تا Role داشته باشه.اطلاعات وارد کنه و بخونه.چیزی باشه که آماده آپلود باشه و نخای کاراضافه ای روش انجام بدی.به قول معروف همه تدابیر رو اندیشیده باشی (اگه 3-2 صفحه هم باشه مساله ای نیست) میخام ازتون چیز یاد بگیرم
ممنون
malloc
شنبه 09 دی 1391, 09:33 صبح
از طریق سشن ROLE ، چک کن که آیا طرف مدیر هستش یا نه ؟؟؟ اگه بود اجازه ورود بده و در غیز اینصورت هدایت بشه به صفحه مثلا : User.aspx
دوست من وقتی مشکل اصلی و اساسی من همینجاست دیگه . وقتی من کد کنترل کاربر و تو صفحه مستر بزنم وقتی کاربر مثلا به صفحه user.aspx هدایت بشه بازم کدهای درون pagelod صفحه مستر من اجرا میشه و باز هم میخواد کاربر و به user.aspx ببره و دوباره ......
متوجه شدید
Alfred188
شنبه 09 دی 1391, 09:56 صبح
درود دوست خوب، شما یه صفحه بدون مسترپیج به اسم لاگین توی اون پوشه ایجاد کن و فیلد های ورودت رو اونجا قرار بده که مدیر بتونه از طریق اون لاگین کنه، بعد طبق گفته دوستان تو مسترپیج چک کن طرف مدیر هست یا نه اگه بود که چه خوب اگر هم نبود بفرستش به این صفحه لاگین که تو لودش کدی برای چک کردن نقش طرف نداره و تو لوپ نمیوفته
موفق باشید
malloc
شنبه 09 دی 1391, 11:13 صبح
الان مثلا اومدم بهینه کنم این کار رو و اینجوری نوشتم :
یه کلاس ساختم که توش سه تا تابع زیر هست :
public string ChkSessionAdmin(string UserNameSession, string UserTypeSession)
{
if (UserNameSession != string.Empty && UserTypeSession == "2")
return "admin";
if (UserNameSession != string.Empty && UserTypeSession == "1")
return "registerd";
return "guest";
}
public string ChkCookieAdmin(string UsernameCookie, string PasswordCookie)
{
if (UsernameCookie != string.Empty)
{
if (chkCookieValid(UsernameCookie, PasswordCookie) == 2)
return "admin";
if (chkCookieValid(UsernameCookie, PasswordCookie) == 1)
return "registerd" ;
return "guest";
}
return "Guest";
}
public int chkCookieValid(string Username, string Password)
{
try
{
Linq.NDT_TabelsDataContext Cookie = new Linq.NDT_TabelsDataContext();
var j = from k in Cookie.Users where (k.UserName == Username && (k.Password == Password)) select k;
if (j.First().usertype.ToString() == "2")
return 2;
else if (j.First().usertype.ToString() == "1")
return 1;
return 0;
}
catch { return 0; }
}
بعد تو هر صفحه مدیریت کد زیر رو میزنم :
try
{
if (Sc.ChkSessionAdmin(Session["username"].ToString(), Session["UserType"].ToString()) != "admin")
Response.Redirect("~/Default.aspx");
}
catch
{
try
{
if (Sc.ChkCookieAdmin(Request.Cookies["NDT"].Values["username"].ToString(), Request.Cookies["NDT"].Values["password"].ToString()) != "admin")
Response.Redirect("~/Default.aspx");
}
catch { Response.Redirect("~/Default.aspx"); }
}
میدونم خیلی ضایع هست. اما جانه خودم هر روشه دیگه ای رو میرم Bug داره
فقط این نکته رو هم بگم من باید همیشه هم کوکی و چک کنم هم session رو .یعنی اول session بعد کوکی
alihassanabadi
شنبه 09 دی 1391, 14:23 عصر
سلام
فقط سشن رو چک کن اونم تو مستر پیج و اگه وجود نداشت
catch اجرا میشه و کاربر رو به login هدایت کن
جواب شما
اینجا پست شماره 26
http://barnamenevis.org/showthread.php?211255-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%A8%D9%87-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A8%D8%AF%D9%88%D9%86-login/page2
و اینجا پست شماره 8
http://barnamenevis.org/showthread.php?235568-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A8%D8%B1%DA%AF%D8%B4%D8%AA-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1
موفق باشید.
malloc
شنبه 09 دی 1391, 14:42 عصر
دوست من اگه قراره من کوکی رو چک نکنم دیگه کوکی به چه درد میخوره ؟؟؟؟؟
و ضمنا این راههایی که شما میگید همشو من رفتم همشون یجورایی میخورن به حلقه تکرار. چون وقتی تو مسترپیچ مینویسی بازم به هر صفحه ای redirect کنی کدهای مستر اجرا میشن و دوباره redirect میشه و...
مگه اینکه صفحه ای که داره بهش redirect میشه جزء صفحات فرزند نباشه؟؟؟:متفکر:
malloc
شنبه 09 دی 1391, 14:56 عصر
آخه دوستان چطوری میتونم تو master این کد بنویسیم . وجدانا هرجور حساب میکنم bug داره . آخه چطور با چک کردن سشن تو مسترپیج بفهمم که این کیه که تو سایته ؟؟؟ اگه سشن خالی بود چطور بهش بفهمونم فلان صفحه مدیریت که خواست بره جلوشو بگیره . اگه تو مستر پیج بنویسم هرصفحه که میاد بالا میره صفحه خطا چون کدهای مسترپیج اجرا میشه. اه ولش کن اصلا همشو تو صفحات مینویسم نهایتا 400 خط مد به پروژم تحمیل میشه دیگه . کفرمو درآورد:عصبانی++:
alihassanabadi
شنبه 09 دی 1391, 15:04 عصر
دوست من اگه قراره من کوکی رو چک نکنم دیگه کوکی به چه درد میخوره ؟؟؟؟؟
بله در صورتی که میخواید اطلاعاتی رو از کوکی واکشی کنید کوکی به دردت میخوره
من برای کنترل اینکه کسی از طرق آدرس بار وارد صفحه مدیریت نشه دوتا تابع زیر و نوشتم . میشه یه نظر بدید که خوبه یا نه ؟؟؟
من فقط یک راهی واسه پاسخ به این بهتون دادم و کسی نمیتونه از طریق آدرس بار وارد صفحه مدیریت شه و بعد از SignOut هم دکمه back کار نمیکنه
تو پروژه هایی که از امنیت Asp.net و RoleProvider مربوط به asp.net استفاده نمیکنن از این روش استفاده میکنم بدون مشکل.
و هیچ حلقه ی تکراری وجود نداره چون فقط یک try-catch سادست.
در هر صورت شما از امنیت و رول های asp.net استفاده کن خیلی سادست.
و یا اگه نمیخوای خودت تو sql تیبل نقش ها- کاربران و تیبل(کاربر در نقش UserInRole) رو بساز
و یک کلاس بساز که از RoleProvider ارث بری کنه و یکی دوتا از متدهاشو override کن.
alihassanabadi
شنبه 09 دی 1391, 15:10 عصر
آخه دوستان چطوری میتونم تو master این کد بنویسیم
یعنی چی خب تو Page_Loade مربوط به مستر پیج بنویسش
آخه چطور با چک کردن سشن تو مسترپیج بفهمم که این کیه که تو سایته ؟؟؟
مگه تو لاگین صحت کاربر رو بررسی نمیکنی؟ خب دیگه اون لینک هایی که دادم رو قشنگ بخون
اگه سشن خالی بود چطور بهش بفهمونم فلان صفحه مدیریت که خواست بره جلوشو بگیره
فکر کنم کلا سناریوت اشتباست
اگه هر ادمین حق دسترسی خواسی داره از RoleProvider ها استفاده کن دیگه چرا خودت ناراحت میکنی:لبخند:
malloc
شنبه 09 دی 1391, 15:13 عصر
والا منکه بیخیال شدم و بقول دوستم از همون روش تف مالی کاره خودمو راه میندازم بیخیال تعداد خط کد بالا .
tnx all of u
alihassanabadi
شنبه 09 دی 1391, 15:19 عصر
والا منکه بیخیال شدم و بقول دوستم از همون روش تف مالی کاره خودمو راه میندازم بیخیال تعداد خط کد بالا .
اگه پروژت دانشجویی و از این جور چیزا
آره بابا راست میگی
ولی ولی
اگه پروژت رو در آینده میخوای آپلود کنی قبول ندارم سعی کن base کار رو درست طراحی کنی تا در آینده اگه خواستی تغییر یا ارتقا بدی به راحتی بتونی
و در آخر تصمیم با خودته برادر.
موفق باشی.
malloc
شنبه 09 دی 1391, 16:15 عصر
سلام
فقط سشن رو چک کن اونم تو مستر پیج و اگه وجود نداشت
catch اجرا میشه و کاربر رو به login هدایت کن
جواب شما
اینجا پست شماره 26
http://barnamenevis.org/showthread.php?211255-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1-%D8%A8%D9%87-%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A8%D8%AF%D9%88%D9%86-login/page2
و اینجا پست شماره 8
http://barnamenevis.org/showthread.php?235568-%D8%AC%D9%84%D9%88%DA%AF%DB%8C%D8%B1%DB%8C-%D8%A7%D8%B2-%DA%A9%D9%84%DB%8C%D8%AF-%D8%A8%D8%B1%DA%AF%D8%B4%D8%AA-%D9%85%D8%B1%D9%88%D8%B1%DA%AF%D8%B1
موفق باشید.
ای آقا دوست من ، من تازه لینکهاتو کامل خوندم .
اینایی که تو داری میگی همون روشی هست که من میخوام برم و ملت میگن غیر اصولیه .
روش من اینه: من سشن رو دارم کوکی رو هم دارم . تو لود صفحات مدیریت چک میکنم که اگه سشن یا کوکی مطعلق به مدیر نبود بره به صفحه خطا
فکر کنم شما هم تو دوتا لینک بالا همین روش رو گفتی دیگه ؟؟؟
فقط چون من باید کوکی رو هم چک کنم یکم خط کدم بیشتر میشه و بخاطر همین کلاس بندی کردمش که خط کدم کم بشه . شما پست 12 همین تاپیک و نیگاه کن . چهارمین تابع مشابه همونی هست که شما گفتی تو لود صفحات مدیریتی بنویسم.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.