PDA

View Full Version : اعطای مجوز دوگانه در فولدرها



faramarz_s
چهارشنبه 10 دی 1382, 11:02 صبح
1-برای اینکه به همان روش دسترسی به سایت که با کمک فایل وب کانفیگ صورت می پذیرفت بتوانیم به کاربرانی غیر از ادمین اجازه مرور و ویرایش صفحاتی خاص در فولدر ادمین بدهیم چگونه باید این مجوز را به ایشان با همان روش داد؟
بر فرض کاربر نباید بتواند به بخش اضافه کردن کاربران وارد شود اما لازم است که بتواند به بخش ویرایش محتویات وارد شده و اعمال نفوذ محدود داشته باشد.

Mahdavi
چهارشنبه 10 دی 1382, 18:51 عصر
با سلام
یه روش اینه که شما یه session و یا کوکی بسازید و اونو چک کنید. بر اساس این که آیا این session هست یا نه و یا کوکی مقدار لازم رو داره اجازه ورود به صفحه رو بدی. عمل چک رو هم میتونی تو pageload بزاری

موفق باشی

faramarz_s
چهارشنبه 10 دی 1382, 21:22 عصر
این روش form Authentication یک مطلبی جدای از سشن و کوکی است اگر در این مورد شما بتوانید کمک کنید تشکر می کنم :oops:
ببینید به نظر می رسه که استفاده از دیتا بیس کاربران و اختصاص سطوح دسترسی هم جالب باشه من در این مورد هم کار کرده ا ام اما با وب کانفیگ می خواهم.
البته هنوز منتظر نظر استاد نصیری هستم :oops:
http://www.merat.org/pic/qp01.jpg

Abbas Arizi
پنج شنبه 11 دی 1382, 15:09 عصر
به نظر من شما بهتره به جای اینکه دنبال مجوز دوگانه باشید رل هاتون رو به صورت سلسله مراتبی تعریف کنید. یعنی فرضا کسی که Admin هست Moderator هم هست. بنابراین هم میتونه به فولدر Admin دسترسی داشته باشه و هم به فولدر Moderator ولی Moderator فقط میتونه به یک فولدر دسترسی پیدا کنه. برای نقشهای دیگه مثل کاربرهای معمولی هم به همین روش عمل بشه. تعریف رل ها هم توی دیتا بیس انجام میشه.
فکر میکنم راه اصولیش هم همینه. (توی فروم ASP.NET دقیقا از این روش استفاده شده)


این روش form Authentication یک مطلبی جدای از سشن و کوکی است
اتفاقا خیلی هم جدا نیست. form Authentication در حقیقت یک شناسایی مبتنی بر کوکی است و در نسخه های بتا هم به همین نام بوده یعنی Cookie Authentication

Abbas Arizi
پنج شنبه 11 دی 1382, 16:30 عصر
برای تعیین اعتبار هم در فایل Global.asax در رویداد Application_AuthenticateRequest بوسیله این کد ایتدا یک کوکی به این شکل ایجاد کنید:


using System.Web.Security;
using System.Security.Principal;

string strUserName = Context.User.Identity.Name;
string roleCookieName = "CookieName";
string strRole = GetRoleFormDataBase(strUserName);
string[] strRoles = {};

if (Request.Cookies[roleCookieName] == null || Context.Request.Cookies[roleCookieName].Value == "")
{
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, User.Identity.Name, DateTime.Now,
DateTime.Now.AddMinutes(5), false, strRole);
string strData = FormsAuthentication.Encrypt(ticket);
HttpCookie rolCookie = new HttpCookie(roleCookieName, strData);
rolCookie.Expires = DateTime.Now.AddMinutes(5);
Response.Cookies.Add(rolCookie);
}


بعد برای خواندن کوکی و تعیین اعتبار از این روش استفاده کنید:

FormsAuthenticationTicket ticket2 = null;
if (Request.Cookies[roleCookieName] != null)
{
ArrayList rolesArrayList = new ArrayList();
foreach (String role in ticket2.UserData.Split( new char[] {';'} ))
{
if (role.Length > 0)
rolesArrayList.Add(role);
}

strRoles = (string[]) rolesArrayList.ToArray(typeof(string));

ticket2 = FormsAuthentication.Decrypt(Request.Cookies[roleCo okieName].Vaue;
if (ticket2.Name == strUserName)
Context.User = new GenericPrincipal(User.Identity, strRoles);
else
Response.Cookies[roleCookieName].Expires = DateTime.Now;
}


توی Web.Config دو تا فولدر ایجاد کنید. توی فولدر Admin فرضا این رو بنویسید:

<system.web>
<!-- This setting is configured so that only authenticated users can visit any of the
pages in the Admin directory -->
<authorization>
<allow roles="Admin" />
<deny users="*" />
</authorization>
</system.web>

</configuration>

ولی توی فولدر Moderator این رو بنویسید: (توی این یکی دو تا رل تعریف شده)

<configuration>

<system.web>
<!-- This setting is configured so that only authenticated users can visit any of the
pages in the Admin directory -->
<authorization>
<allow roles="Admin, Moderators" />
<deny users="*" />
</authorization>
</system.web>

</configuration>

faramarz_s
پنج شنبه 11 دی 1382, 20:34 عصر
از پاسخ کامل شما سپاسگذارم.آیا کد سی شارپ همه دارید؟

Abbas Arizi
جمعه 12 دی 1382, 00:17 صبح
آیا کد سی شارپ همه دارید؟

منظورتون رو درست متوجه نشدم.

faramarz_s
جمعه 12 دی 1382, 09:19 صبح
ببخشید یه ه اضافه تایپ شده بود؟
:oops: *کد معادل سی شارپ مبحث فوق را هم دارید؟ :wink:

Abbas Arizi
جمعه 12 دی 1382, 12:30 عصر
یعنی منظورتون اینه که کدهایی که من نوشتم کد سی شارپ نیستند؟ :shock:

faramarz_s
جمعه 12 دی 1382, 14:44 عصر
نه نه باز هم خوب ننوشتم! :P
کد سی شارپ کامل فرومی که از آن نام برده و اقتباس کرده اید یا مقاله ای در این زمینه
را می گویم.
روش زیر چطوره:


<location path="page.aspx">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>

Abbas Arizi
جمعه 12 دی 1382, 18:09 عصر
در مورد مقاله فعلا به جز MSDN مرجع خاصی سراغ ندارم. توی MSDN یکی دوتا مطلب و مثال وجود داره که فکر میکنم برای شروع کافیه. البته این مبحث جای مطالعه بیشتری رو هم داره.
فرومی هم که نام بردم همون فروم ASP.NET معروفه. گمون می کردم که شما با اون آشنایی دارید. به هر حال از این آدرس میتونید اون رو دانلود کنید:
http://www.asp.net/Default.aspx?tabindex=7&tabid=41

در خصوص روشی هم که گفتید این روش برای تعیین صفحاتی که نیاز به Login وشناسایی کاربر دارند، به کار میره و با اون نمیشه یک تعیین اعتبار بر مبنای نقش (Role-Based Authentication) انجام داد.

faramarz_s
جمعه 12 دی 1382, 21:06 عصر
من میخواهم ازطریق بانک اسکیوئل +Role based Authentication+کوکی ها برای اعطای مجوز حرکت کنم:
1-کاربر با یوزر نیم وپسوردی که از بانک خوانده می شود وارد صفحه مدیریت می شود.
2-در جدول بانک برای هر کابری یک رول تعریف شده است.
3-در فایلGlobal.asaxتغییرات لازم داده شده و ...

private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
if (isUserValid(TextBox1.Text.ToString(),TextBox2.Tex t.ToString()))
{
Response.Redirect("Admin/AdminPage.aspx");

//FormsAuthentication
FormsAuthentication.Initialize();

// Create our connection and command objects
string strCon = ConfigurationSettings.AppSettings["ConnStr"];
SqlConnection conn = new SqlConnection(strCon);

SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT roles FROM tblUser WHERE username=@username " +
"AND password=@password";

// Fill our parameters
cmd.Parameters.Add("@username", SqlDbType.NVarChar, 64).Value =
TextBox1.Text.ToString();
cmd.Parameters.Add("@password", SqlDbType.Binary, 16).Value =
FormsAuthentication.HashPasswordForStoringInConfig File(
TextBox2.Text.ToString(), "md5"); // Or "sha1"

// Execute the command
conn.Open();
SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
// Create a new ticket used for authentication
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
TextBox1.Text.ToString(), // Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddMinutes(30), // Date/time to expire
true, // "true" for a persistent user cookie
reader.GetString(0), // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for

// Encrypt the cookie using the machine key for secure transport
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket

// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;

// Add the cookie to the list for outgoing response
Response.Cookies.Add(cookie);

// Redirect to requested URL, or homepage if no previous page
// requested
string returnUrl = Request.QueryString["../Default.aspx"];
if (returnUrl == null) returnUrl = "../Default.aspx";

// Don't call FormsAuthentication.RedirectFromLoginPage since it
// could
// replace the authentication ticket (cookie) we just added
Response.Redirect(returnUrl);
}
else
{
// Never tell the user if just the username is password is incorrect.
// That just gives them a place to start, once they've found one or
// the other is correct!
ErrorLabel.Text = "Username / password incorrect. Please try again.";
ErrorLabel.Visible = true;
}

reader.Close();
conn.Close();

}
}


protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated )
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id =
(FormsIdentity)HttpContext.Current.User.Identit y;
FormsAuthenticationTicket ticket = id.Ticket;

// Get the stored user-data, in this case, our roles
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}

private void Page_Load(object sender, System.EventArgs e)
{
/*if (User.IsInRole("Admin"))
{
Label1.Text = "Welcome Administrator " + Context.User.Identity.Name;
HyperLink24.Enabled=true;
}
else*/
//if (User.IsInRole("Manager")) Label1.Text="Manager";
//Label1.Text="Welcome Manager"+ Context.User.Identity.Name;
//HyperLink24.Enabled=false;
همه بخشها درسته بجز این تشخیص رول هر کابر در Page_Load صفحه مدیر :oops:
شما چه پیشنهادی دارید ؟
بهر حال تشکر :wink:

Abbas Arizi
جمعه 12 دی 1382, 22:35 عصر
والا چیز خاصی به دهن من نمیرسه. چون اگه واقعا همه بخشهای دیگه درست کار میکنه این هم باید جواب بده. ممکنه اشتباه نوشتاری این جور چیزا باشه.

faramarz_s
شنبه 13 دی 1382, 12:35 عصر
بله اصول که درسته فقط مجوز صحیح اعطا نمی شود :o
جالبه پیغام خطایی نیست :shock:
البته همیشه راه حل هست:
چطوره که مستقیم در پیج لود نوع رول را چک کنم؟
فقط می ترسم سرعت پایین بیاد؟

faramarz_s
شنبه 13 دی 1382, 14:47 عصر
برای راهکار فوق سشنی در رویداد باتن قرار می دهیم.
هر بار که کاربری می خواهد لاگین نماید 3 نوع داده از وی می گیریم:
الف-یوزر نیم ب-پسورد ج-رول
رول را در یک سشن ذخیره می کنیم تا هر جا نیاز داشتیم آنرا چک کرده و بر اساس آن رول به کاربران اجازه ورود/عدم ورود بدهیم.

private void ImageButton1_Click(object sender, System.Web.UI.ImageClickEventArgs e)
{
if (isUserValid(TextBox1.Text.ToString(),TextBox2.Tex t.ToString(),DropDownList1.SelectedValue))
{
Response.Redirect("Admin/AdminPage.aspx");
Session["s1"] = DropDownList1.SelectedValue.ToString();
}
else
{
ErrorLabel.Text = "Username/password/Role Incorrect";
ErrorLabel.Visible = true;
}


//Label1.Text="Welcome" + Session["s1"].ToString();
Response.Write(Session["s1"].ToString());
/*if(!Page.IsPostBack)
bindToNews();
checkLogin(Session["s1"],this);*/

/* if ( Session["s1"].ToString()=="Admin" )
{
HyperLink24.Visible=true;
}
else if ( Session["s1"].ToString()=="Manager" )
{
HyperLink24.Visible=false;
}*/
حالا پیغام خطای زیر را می دهد چرا؟

Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:


Line 72: {
Line 73: //Label1.Text="Welcome" + Session["s1"].ToString();
Line 74: Response.Write(Session["s1"].ToString());
Line 75: /*if(!Page.IsPostBack)
Line 76: bindToNews();


Source File: d:\inetpub\wwwroot\edu\nahie\admin\adminpage.aspx. cs Line: 74

Abbas Arizi
شنبه 13 دی 1382, 15:14 عصر
شما با استفاده از Session و این روالی که گفتید در حقیقت خودتون رو از مزایای امنیت در ASP.NET محروم میکنید و بنابراین هیچ نیازی به استفاده از اون ندارید.
من خودم توی یک برنامه از روشی که در بالا از اون صحبت شد استفاده کردم وبسیار خوب هم کار میکنه.
همون کدی که شما نوشتید رو هم من عینا تست کردم و درست کار کرد. احتمالا یه جای دیگه از کارتون ایراد داره. ممکنه فایل Web.config رو به طور صحیح تنظیم نکردید یا اینکه کلمات رو توی Web.config یا دیتابیس جابجا نوشتید. سعی کنید همه اینها رو یک بار دیگه چک کنید ببینید کجای کار ایراد داره.

faramarz_s
شنبه 13 دی 1382, 21:50 عصر
1-ببینید ادمین وب سایت باید بتواند کاربران را با سطوح دسترسی مختلف ایجاد نموده و حتی یوزر نیم و پسورده ای را عوض کرده و کلا خیلی امور مرتبط با دیتا بیس را انجام دهد.
2-در ضمن چون باید اموری نظیر حذف و آپدیت از طریق دیتا گرید صورت بگیرد باز ما نیاز به دیتا بیس داریم.
3-مشخصا وب کانفیگ باید آوررایت شده هر وقت که ادمین اراده کند و مشکلات خاص خودش رو دارد.در ضمن آپدیت و دیلییت و ... با دیتا گرید پیاده سازی باید بشود.مقااله یا نمونه ای که کامل مسائل مورد نیاز را پوشش بدهد سراغ دارید؟
:wink:
4- در مجموع من مشکل را حل می کردم با چند دقیقه بررسی دقیق آنچه شما تذکر دادید ولی اگر بخواهم که همان روش شما و روش اول خودم را در قالب دیتا بیس نه وب کانفیگ پیاده کنم چه پیشنهادی می فرمایید.
5-الف-آقا در ضمن منظور شما از محرومیت را متوجه نشدم مگر کسی می تواند به سشن برنامه دسترسی پیدا کند یا ...؟
5-ب-تازه پسوردها در دیتا بیس هش شده با MD5و در سشن فقط رول را داریم :!: در این مورد هم نظرتان را بفرمایید.
از مصاحبت با کسی که در کل فروم ما را تحویل گرفت لذت می برم :lol:

Abbas Arizi
شنبه 13 دی 1382, 23:30 عصر
1و2و3و4: ببینید به نظر من بهتره که شما رلهای مختلفی که میتونه توی سایت وجود داشته باشه رو پیش بینی کنید و به هر کدوم از اونها یک فولدر اختصاص بدید. تبعا میتونید توی صفحاتی که توی این فولدرها قرار میدید متناسب با هر نقشی صفحه مربوط به اون رو طراحی کنید.
فرضا برای ادمین صفحاتی طراحی کنید که تمام اختیاراتی که گفتید توی اونها لحاظ شده باشه.
برای Moderator صفحاتی رو طراحی کنید که اختیارات محدودتری داشته باشه و الخ.
ادمین میتونه هر کاربری رو در قالب یکی از این وظایف قرار بده.
این طوری همه چیز رو از قبل پیش بینی کردید و نیازی به Overwrite کردن Web.config و این حرفا ندارید.
ولی اگه میخواید که از این روش استفاده نکنید راه حلش اینه که توی دیتابیس خودتون یک جدول برای Permission های مختلف طراحی کنید و مثلا فیلدهای حذف، آپدیت و ... رو توی اون قرار بدید و بگید که هر نقشی چه اختیاراتی داره. فرضا فلان نقش فقط اختیار آپدیت کردن داره یا فلان گروه هم میتونه حذف کنه و هم آپدیت. در این حالت کنترل همه چیز در اختیار خودتونه و باید با برنامه نویسی مجوزها رو کنترل کنید که این روش بیشتر توی ASP کلاسیک استفاده میشه (فرضا توی فروم WebWiz از اون استفاده شده)
5: الف. اگرچه امکان دسترسی غیر مجاز به Session میتونه وجود داشته باشه (البته نه به این سادگیها) ولی منظور من این نبود. منظور من این بود که شما با این کار از یک مزیت و تسهیلاتی که قبلا پیش بینی شده و مطمئن تر هم هست، استفاده نمی‌کنید.
ب. به نظر من هم بهتره که توی Session تا اونجایی که ممکنه اطلاعات کمتری رو قرار بدیم.
ما مخلص شمائیم. :oops: ما هم همچنین از مصاحبت با شما خرسند شدیم.

به هر حال اینها اون چیزهایی بود که به نظر بنده حقیر اومد. :idea: اگه فکر می‌کنید راضیتون نمی‌کنه توصیه می‌کنم از دوستان و اساتید دیگه یاری بطلبید. :oops:

در پناه حق

faramarz_s
یک شنبه 14 دی 1382, 12:40 عصر
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/aspnet-securingapps.asp