PDA

View Full Version : سوال: مدیریت دسترسی کاربرها به صفحات در asp.net web form



mohammad-i
جمعه 01 اردیبهشت 1396, 11:39 صبح
سلام.
من توی پروژه ام از فرم های لاگین asp استفاده نکردم و فرم ها رو خودم طراحی کردم.
توی دیتابیس یوزر ها برای هر یوزر نقش دسترسی قرار دادم(مثل admin-manager- ...).
در حال حاظر برای دسترسی به صفحات، توی هر صفحه بررسی میکنم که نقش کاربر رو از دیتابیس بخونه و اجازه به اون صفحه رو بده یا نده.

با توجه به تعداد زیاد صفحات، میخوام این کار رو به صورت یکپارچه انجام بدم. مثلا توی web.config
میدونم که با <authorization> و role در web.config میشه این کار رو کرد، ولی همانطور که گفتم من از دیتابیس های پیش فرض asp استفاده نکردم.
ممنون میشم راهنمایی کنید چطور این کارو بکنم. یا اگر روش دیگه ای هم باشه ممنون میشم بگید.

با تشکر.

BookWorm
جمعه 08 اردیبهشت 1396, 20:52 عصر
باسلام. دوست عزیز شما ابتدا باید جداول زیر رو با این مشخصات تشکیل بدید.
1. جدول کاربران: شماره،نام کاربری،رمزعبور،شماره گروه کاربر،وضعیت
2. جدول گروه های کاربری: شماره، نام گروه
3. جدول صفحات سایت: شماره،نام فارسی صفحه،نام لاتین صفحه
4. جدول دسترسی گروه ها به صفحات: شماره،شماره صفحه،شماره کاربر،وضعیت دسترسی
منظور از فیلد "شماره گروه کاربری" همان فیلد کلید خارجی از جدول گروه کاربری هست و به همین ترتیب در جدول دسترسی گروه ها به صفحات نیز همینطور است.
هم اکنون صفحه accessdenied را نیز بسازید و در جدول صفحات وارد نکنید. همچنین صفحه ای برای حق دسترسی دادن به گروه های کاربری در صفحات بسازید.
حال باید در کد صفحه masterpage این کدها رو نوشت. با خواندن کدها خودتون میتونید تغییرات مورد نیاز رو اعمال کنید.


protected void Page_Load(object sender, EventArgs e)
{
if (Session["User_ID_"] == null)
Response.Redirect("~/Manage/Login.aspx");
else
{
Lbl_UserFLName.Text = Session["User_FLName"].ToString();
Lbl_UserGroup.Text = Session["User_Group"].ToString();
}
if (!IsPostBack)
{
Sub_SetData();
}
Sub_CheckPageAccess();
}

private void Sub_SetData()
{
Sub_SetAccess();
}

public void Sub_SetAccess()
{
try
{
DataTable SqlDT = new DataTable();
ClsMain.Sub_SetDB();
ClsMain.SqlDA.SelectCommand.CommandType = CommandType.Text;
ClsMain.SqlDA.SelectCommand.CommandText = @"SELECT TblUser_Page.Page_NameFa, TblUser_Page.Page_NameEn,
TblUser_Access.Access_Select, TblUser_Access.Access_Insert, TblUser_Access.Access_Update, TblUser_Access.Access_Delete
FROM TblUser_Access INNER JOIN TblUser_Page ON TblUser_Access.Access_Page_ID = TblUser_Page.Page_ID_
WHERE (TblUser_Access.Access_Group_ID = @Access_Group_ID) AND (TblUser_Page.Page_Status = 1) AND (TblUser_Page.Page_PID > 0)";
ClsMain.SqlDA.SelectCommand.Parameters.Add("@Access_Group_ID", SqlDbType.Int).Value = Session["User_Group_ID"];
ClsMain.SqlDA.SelectCommand.ExecuteNonQuery();
ClsMain.SqlDA.Fill(SqlDT);
GridView_Access.DataSource = SqlDT;
GridView_Access.DataBind();

for (int Indx = 0; Indx <= SqlDT.Rows.Count - 1; Indx++)
Session["Page_" + SqlDT.Rows[Indx][1].ToString()] = SqlDT.Rows[Indx][2].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][3].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][4].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][5].ToString().PadRight(5, ' ');
}
catch (Exception Exp)
{
ClsMain.Sub_MesssageBox(this.Page, Exp.Message);
}
}

public void Sub_CheckPageAccess()
{
if (HttpContext.Current.Request.Url.AbsolutePath.Repl ace("/Manage/", "") != "Default.aspx")
if (HttpContext.Current.Request.Url.AbsolutePath.Repl ace("/Manage/", "") != "AccessDenied.aspx")
if (Session["Page_" + HttpContext.Current.Request.Url.AbsolutePath.Repla ce("/Manage/", "")].ToString().Substring(0, 5).Trim() == "False")
Response.Redirect("~/Manage/AccessDenied.aspx");
else
{

}
}

موفق باشید.

mohammad-i
شنبه 09 اردیبهشت 1396, 08:29 صبح
باسلام. دوست عزیز شما ابتدا باید جداول زیر رو با این مشخصات تشکیل بدید.
1. جدول کاربران: شماره،نام کاربری،رمزعبور،شماره گروه کاربر،وضعیت
2. جدول گروه های کاربری: شماره، نام گروه
3. جدول صفحات سایت: شماره،نام فارسی صفحه،نام لاتین صفحه
4. جدول دسترسی گروه ها به صفحات: شماره،شماره صفحه،شماره کاربر،وضعیت دسترسی
منظور از فیلد "شماره گروه کاربری" همان فیلد کلید خارجی از جدول گروه کاربری هست و به همین ترتیب در جدول دسترسی گروه ها به صفحات نیز همینطور است.
هم اکنون صفحه accessdenied را نیز بسازید و در جدول صفحات وارد نکنید. همچنین صفحه ای برای حق دسترسی دادن به گروه های کاربری در صفحات بسازید.
حال باید در کد صفحه masterpage این کدها رو نوشت. با خواندن کدها خودتون میتونید تغییرات مورد نیاز رو اعمال کنید.


protected void Page_Load(object sender, EventArgs e)
{
if (Session["User_ID_"] == null)
Response.Redirect("~/Manage/Login.aspx");
else
{
Lbl_UserFLName.Text = Session["User_FLName"].ToString();
Lbl_UserGroup.Text = Session["User_Group"].ToString();
}
if (!IsPostBack)
{
Sub_SetData();
}
Sub_CheckPageAccess();
}

private void Sub_SetData()
{
Sub_SetAccess();
}

public void Sub_SetAccess()
{
try
{
DataTable SqlDT = new DataTable();
ClsMain.Sub_SetDB();
ClsMain.SqlDA.SelectCommand.CommandType = CommandType.Text;
ClsMain.SqlDA.SelectCommand.CommandText = @"SELECT TblUser_Page.Page_NameFa, TblUser_Page.Page_NameEn,
TblUser_Access.Access_Select, TblUser_Access.Access_Insert, TblUser_Access.Access_Update, TblUser_Access.Access_Delete
FROM TblUser_Access INNER JOIN TblUser_Page ON TblUser_Access.Access_Page_ID = TblUser_Page.Page_ID_
WHERE (TblUser_Access.Access_Group_ID = @Access_Group_ID) AND (TblUser_Page.Page_Status = 1) AND (TblUser_Page.Page_PID > 0)";
ClsMain.SqlDA.SelectCommand.Parameters.Add("@Access_Group_ID", SqlDbType.Int).Value = Session["User_Group_ID"];
ClsMain.SqlDA.SelectCommand.ExecuteNonQuery();
ClsMain.SqlDA.Fill(SqlDT);
GridView_Access.DataSource = SqlDT;
GridView_Access.DataBind();

for (int Indx = 0; Indx <= SqlDT.Rows.Count - 1; Indx++)
Session["Page_" + SqlDT.Rows[Indx][1].ToString()] = SqlDT.Rows[Indx][2].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][3].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][4].ToString().PadRight(5, ' ') + SqlDT.Rows[Indx][5].ToString().PadRight(5, ' ');
}
catch (Exception Exp)
{
ClsMain.Sub_MesssageBox(this.Page, Exp.Message);
}
}

public void Sub_CheckPageAccess()
{
if (HttpContext.Current.Request.Url.AbsolutePath.Repl ace("/Manage/", "") != "Default.aspx")
if (HttpContext.Current.Request.Url.AbsolutePath.Repl ace("/Manage/", "") != "AccessDenied.aspx")
if (Session["Page_" + HttpContext.Current.Request.Url.AbsolutePath.Repla ce("/Manage/", "")].ToString().Substring(0, 5).Trim() == "False")
Response.Redirect("~/Manage/AccessDenied.aspx");
else
{

}
}

موفق باشید.

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

BookWorm
شنبه 09 اردیبهشت 1396, 23:22 عصر
ممنون دوست عزیز ، ولی شما خیلی سخت کردید کار رو :لبخندساده:
من با یه جدول کاربر ها این کار رو انجام دادم.
راهش خیلی ساده تر از اونی بود که فکر می کردم، فقط لازم بود کد های بررسی رو به جای هر صفحه توی مستر پیج بزارم.
نمیدونم چرا حواسم نبود:متفکر:

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