PDA

View Full Version : سوال: جلوگیری از دسترسی کاربران به برخی پوشه ها



mojtaba-n
پنج شنبه 18 دی 1393, 01:48 صبح
سلام خدمت دوستان و اساتید محترم.
سوال من اینه که در asp.net چطور میشه جلوی دسترسی کاربران به برخی پوشه ها و فایلهای داخل اون رو گرفت تا از طریق url یا سایر روشها محتویات اون پوشه رو نتونن ببینند؟
اگه برای اینکار کد خاصی لازمه ممنون میشم که کد رو هم بزارید.
:قلب:

amir_T_2008
پنج شنبه 18 دی 1393, 02:55 صبح
شما ميتونيد با استفاده از web.config اينكارو بكنيد.به اين شكل كه فولدري كه ميخوايد فقط كاربراي خاصي ببينن يك web.config قرار ميدي و بعد كد زير اضافه ميكني و با استفاده از رولهايي كه قبلا تعريف كردي دسترسي به اون پوشه رو فقط براي مثال براي رول admin باز ميذاري








1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>

<authorization>
<allow roles="Admin" />
<deny users="?" />
</authorization>
</system.web>


</configuration>







موفق باشيد

mojtaba-n
پنج شنبه 18 دی 1393, 03:13 صبح
خیلی ممنون. فقط یه مشکلی که هست اینه که من از asp.net configuration استفاده نکردم و بخش user managment رو خودم نوشتم. بنابراین رول تعریف نکردم. در این صورت آیا بازهم میشه از روش فوق استفاه کرد ؟:متفکر:

LostOfMind
پنج شنبه 18 دی 1393, 09:45 صبح
خوب باید دید مدیریت کاربران رو چطور نوشتی!!

keiv@n
پنج شنبه 18 دی 1393, 10:57 صبح
سلام

بخش user management رو هم خودت نوشته باشی باید یه ستون role داخل پایگاه دادت اضافه کرده باشی!

اگر کلا می خوای دسترسی کاربرای غیر عضو رو به صفحات مشخصی قطع کنی می تونی داخل page_load اون صفحات بنویسی :



protected void Page_Load(object sender, EventArgs e)
{
if (!HttpContext.Current.User.Identity.IsAuthenticate d)
{
Response.Redirect("Default.aspx");
}
}

mojtaba-n
پنج شنبه 18 دی 1393, 21:01 عصر
خیلی ممنون. من یه جدول بنام user دارم که اطلاعات کاربران داخلش قرار داره. اونجا یه فیلد به نام userKindId دارم که از طریق کلید خارجی به جدول دیگه ای بنام UserKind وصل میشه.
داخل جدول UserKind نوع کاربران مشخص میشه که ممکنه admin ,user,... باشند. وقتی که یک کاربر Login میکنه از طریق session تأیید میشه :
Session["Logged"] = "true";




در هنگام ورود به صفحات هم همین شرط چک میشه :
if (Session["Logged"].ToString() != "true")
{
Response.Redirect("~/Login.aspx");
}

حالا چند سوال :
1 - آیا این روش امنیت لازم رو داره ؟
2 - چطور HttpContext.Current.User.Identity.IsAuthenticated رو برای کاربر مورد نظر True کنم ؟
3 - می خوام کاربران معمولی به صفحات مخصوص به admin دسترسی نداشته باشند.
4 - سوال اول تاپیک : چطور جلو دسترسی به پوشه های مربوط به admin رو بگیرم ؟

ahmad156
پنج شنبه 18 دی 1393, 21:57 عصر
Protect Files and Folders Using HttpHandlers in ASP.NET (http://www.codeproject.com/Articles/39158/Protect-Files-and-Folders-Using-HttpHandlers-in-AS)

keiv@n
پنج شنبه 18 دی 1393, 23:47 عصر
سلام

اینطوری عمل کنید :

اگر کاربر شما با موفقیت login کرده باشد آنگاه یک authentication ticket برای او در نظر بگیرید به صورت زیر (این دستور باید دقیقا پس از دستورات login نوشته شود و چک شود که در صورتی که login با موفقیت انجام شده باشد .) :



FormsAuthentication.SetAuthCookie(username,false);


بعد ها از این کوکی استفاده خواهیم کرد ...

چون ما از forms authentication استفاده می کنیم پس باید بدانیم که Asp.Net Framework آبجکت IPrinciple را جهت اهراز هویت کاربران چک خواهد کرد

ID , Role داخل این آبجکت تعیین کننده دسترسی و یا عدم دسترسی کاربر به صفحات وب خواهد بود و تا کنون ما کدی در ارتباط با این آبجکت ننوشته ایم !

میشه گفت که formsauthentication از این کاربر بی خبر است !

پس در این مرحله برای رفع این مشکل باید با override کردن متد FormsAuthentication_OnAuthenticate داخل فایل global.asax شناسایی کاربر به formsauthentication را میسر کنیم .


protected void FormsAuthentication_OnAuthenticate(object sender, FormsAuthenticationEventArgs e)
{
if (FormsAuthentication.CookiesSupported == true)
{
if (Request.Cookies[FormsAuthentication.FormsCookieName] != null)
{
try
{
string userName = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
string roles = mydb.getUserRoles(userName);
e.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(userName , "Forms"), roles.Split(','));
}
catch (Exception ex)
{

}
}
}
}


خوب چن تا مطلب در مورد کد بالا بگم دوتا دستور if اول که تنظیمات authentication و قابلیت هاشونو چک می کنند

اگر شرط ها درست باشن داخل بلوک try میشیم :
دستورات : string userName = FormsAuthentication.Decrypt(Request.Cookies[FormsAuthentication.FormsCookieName].Value).Name;
string roles = dbHelper.getUserRoles(userName);
نام کاربری و role کاربر را در متغییر های username , roles ذخیره می کنند .
دستور : e.User = new System.Security.Principal.GenericPrincipal(new System.Security.Principal.GenericIdentity(userName , "Forms"), roles.Split(','));

میاد principal مورد نظرمونو واسه کاربر رایج می سازه پس الان می تونیم این کاربرو به راحتی authorize کنیم یعنی درمورد دسترسیش به صفحات وب تصمیم گیری کنیم .

درضمن چون من چندین role برای کاربرا درنظر گرفتم از متد split() برای جداسازی استفاده کردم تا role هامو جدا کنم

مثلا یه کاربر می تونه هم زمان هم ادمین باشه هم مدیر به این شکل username:admin, roles=admin;manager

همه چی انجام شد

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

<authorization>
<allow roles="admin" />
<deny users="*" />
</authorization>

امیدوارم استفاده لازم رو برده باشی

موفق باشی