PDA

View Full Version : سوال: عضویت و مدیریت نقش ها



profnami
سه شنبه 14 اردیبهشت 1389, 23:14 عصر
سلام دوستان . کسی میتونه راجع به عضویت پیشرفته و مدیریت نقش ها واسه کاربران اطلاعاتی بده ؟ یا یه لینک مفید .

z_bluestar
چهارشنبه 15 اردیبهشت 1389, 08:55 صبح
مطالب در مورد این زیاده تو سایت
اینو بخون اگه سوالی داشتی در خدمتم
http://www.barnamenevis.org/forum/showthread.php?t=177731

profnami
چهارشنبه 15 اردیبهشت 1389, 18:57 عصر
ممنون از راهنماییتون
من تو سایت 2 پوشه دارم
userPanel
adminPanel
میخوام کاربرهای با نقش عادی به پوشه ی مدیران دسترسی نداشته باشند . برای همین هم از نقش ها استفاده میکنم . این ادیتور سایت هم پدر من رو در اورد وقتی انگلیشی مینویسم قاطی میکنه .
ممکنه بگید که چطور میتونم این کار رو انجام بدم ؟

z_bluestar
پنج شنبه 16 اردیبهشت 1389, 12:08 عصر
Role ها تون کجــا ذخیره شدن ؟؟
Database ؟؟

profnami
پنج شنبه 16 اردیبهشت 1389, 20:14 عصر
بازم ممنونم . من یه فیلد به جدول کاربر ها اضافه کردم واسه ذخیره کردن Role مربوط به هر کاربر . اما من نمیدونم این role ها رو چطوری هنگام Login کردن به کاربر ها اضافه کنم . یعنی باید این Role ها رو چجوری به Authrntication Ticket هر کاربر اضافه کرد ؟

m.hamidreza
پنج شنبه 16 اردیبهشت 1389, 22:05 عصر
شما در این روش باید پرووایدِر Role Manager رو دستی مدیریت کنین و میتونید در متد GetRolesForUser رول ها رو از db بخونید(اسم متد شاید شبیه این باشه).
من یکی دو دفعه این روشو گفتم بگردی پیداش میکنی در یه پست هم آقای کرامتی کامل توضیح دادن.
موفق باشید.

profnami
جمعه 17 اردیبهشت 1389, 01:36 صبح
باز هم ممنونم . اما متاسفانه من لینکی رو که شما معرفی کردید پیدا نکردم . به جاش انواع پروژه ها و راهکارهای دیگه پیدا کردم . اما باز هم در نهایت سوال خودم سر جاش موند . روش کار من تفاوت چندانی با سیستم خود ASP.NET نداره . من ثبت نام رو به صورت دستی انجام میدم . موقع ثبت نام برای هر کاربر Role مورد نظرش رو هم درج میکنم . در هنگام Login هم چک میکنم که کاربر مجاز هست یا نه . اگه مجاز بود با استفاده از این متد اون رو Login میکنم :

FormsAuthentication.RedirectFromLoginPage(txtUsern ame.Text, false);
و بعد با توجه به Role کاربر که ذخیره کردم اون رو به صفحه ی مورد نظر هدایت میکنم .
تا اینجا درست کار میکنه . من حتی تو رویداد Load صفحات هم چک میکنم که کاربر آیا به صفحه ی جاری دسترسی داره یا خیر . ( من لیست صفحات رو به همراه Role هایی که میتونند به اون صفحات دسترسی داشته باشند رو ذخیره کردم تو DataBase ) .
هیچ مشکلی با این روش ندارم . اما حتما باید راهی باشه که من بتونم Role کاربر رو هنگام Login کردن به User اضافه کنم . اینطوری بالاخره بهتر میتونم از این سیستم MemberShip استفاده کنم .
لطفا راهکاری نشان دهید ...

z_bluestar
جمعه 17 اردیبهشت 1389, 08:56 صبح
1- یک کلاس به برنامه اضافه کرده که از RoleProvider به ارث برده شه .این یک کلاس Abstract می باشد پس اجـاره بدین بدنه کلاس پیداه سازی بشه.

2-حالا تو متد GetRolesForUser می تونید کد مورد نظرتون رو قرار بدید . یعنی Return value این متد string[] Roles می باشد که همون Roleهای کـاربر هستند

public class SiteRoleProvider : RoleProvider
{
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override string ApplicationName
{
get
{
throw new NotImplementedException();
}
set
{
throw new NotImplementedException();
}
}

public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}

public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}

public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}

public override string[] GetAllRoles()
{
throw new NotImplementedException();
}

public override string[] GetRolesForUser(string username)
{
string[] roles = new string[1];
try
{
DataSet dsUser = DataLayer.Users.SelectbyUsername(username);
if (dsUser.Tables["Users"].Rows.Count > 0)
{
DataRow drUser = dsUser.Tables["Users"].Rows[0];
roles[0] = drUser["Title"].ToString();
}
dsUser.Dispose();

}
catch (System.Data.SqlClient.SqlException err)
{
DataLayer.ErrorLog.InsertRow(err.Message, 1, "RoleProvider", "GetRolesForUser", DateTime.Now);
}
catch (Exception err)
{
DataLayer.ErrorLog.InsertRow(err.Message, 2, "RoleProvider", "GetRolesForUser", DateTime.Now);
}
return roles;
}

public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}

public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}

public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}

3 -حالا تو web.Config باید مشخص کنی که از این کلاس استفاده کنه .

<system.web>
<roleManager defaultProvider="SiteRoleProvider" enabled="true">
<providers>
<clear />
<add name="SiteRoleProvider" type="abcconstruct.Classes.SiteRoleProvider" />
</providers>
</roleManager>


4-در پوشه AdminPanel هم یک Web.config اضـافه کرده و این کد رو بهش اضـافه کن .
<system.web>
<authorization>
<allow roles="Administrator"/>
<deny users="*"/>
</authorization>
</system.web>

دیگه از این به بعد فقط کـاربرانی که Role Administrator داشته باشند می تونن صفحات داخل این Folder رو ببینن.

profnami
جمعه 17 اردیبهشت 1389, 09:57 صبح
واقعا ممنونم . ميرم اين راه رو چك كنم . اگه مشكلي بود دوباره خبر ميدم ....

profnami
جمعه 17 اردیبهشت 1389, 10:40 صبح
من دقيقا همين كاري كه شما گفتيد رو انجام دادم . اما در واقع پس از Login شدن و بعد از اين كه User رو به كنترل پانل مربوطه هدايت ميكنم (adminPanel/administratorControlPanel.aspx) از كنترل پانل به بيرون Redirect ميشه . البته واضحه كه اين به دليله اينه كه Role مورد نظر به كاربر اضافه نشده . چون ما يه فايل Web.Config تو اون پوشه داريم كه دسترسي همه رو منع ميكنه .
اين هم خود كدي كه شما گذاشتيد من كاملش رو ميزارم :




using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
/// Summary description for SiteRoleProvider
/// </summary>
public class SiteRoleProvider : RoleProvider
{
public SiteRoleProvider()
{
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override string ApplicationName
{
get{throw new NotImplementedException();}
set{throw new NotImplementedException();}
}

public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}

public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}

public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}

public override string[] GetAllRoles()
{
throw new NotImplementedException();
}

public override string[] GetRolesForUser(string username)
{
//string[] roles = new string[1];
//try
//{
// DataSet dsUser = DataLayer.Users.SelectbyUsername(username);
// if (dsUser.Tables["Users"].Rows.Count > 0)
// {
// DataRow drUser = dsUser.Tables["Users"].Rows[0];
// roles[0] = drUser["Title"].ToString();
// }
// dsUser.Dispose();

//}
//catch (System.Data.SqlClient.SqlException err)
//{
// DataLayer.ErrorLog.InsertRow(err.Message, 1, "RoleProvider", "GetRolesForUser", DateTime.Now);
//}
//catch (Exception err)
//{
// DataLayer.ErrorLog.InsertRow(err.Message, 2, "RoleProvider", "GetRolesForUser", DateTime.Now);
//}
string[] roles = new string[1];
myMembership member = new myMembership();
roles[0] = member.GetMemberRoleByUsername(username);
return roles;
}

public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}

public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}

public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}

در واقع من براي هر كاربر يك Role دارم كه اون رو هم توسط متد (GetMemberRoleByUsername(username)) ميخونم و به آرايه ي string[] اضافه ميكنم .
حالا نميدونم مشكل كجاست ....

z_bluestar
جمعه 17 اردیبهشت 1389, 11:26 صبح
برنامه تون رو Debug کنید ببینید کلاس RoleProvider اجرا میشه یا نه ؟؟؟
در WebConfig فولدر panelAdmin چک کنید آیا دقیقـا Key word رول تون رو صحیح تایپ کردید ؟؟؟

برنامه تون رو Debug کنید ببینید کجـا مشکل داره ؟؟؟
کد کلاستون که درسته .

profnami
جمعه 17 اردیبهشت 1389, 11:51 صبح
بله . من خودم تو اين مواردي كه گفتيد مشكلي پيدا نكردم . همه صحيح هستند و سر جاشون .


<configuration>
<appSettings/>
<connectionStrings/>
<system.web>
<authorization>
<!--<allow roles="admin"/>
<deny users="*"/>-->
</authorization>
</system.web>
</configuration>


اين هم Web.Config خود سايت :


<roleManager>
<providers>
<clear/>
<add name="SiteRoleProvider" type="abcconstruct.Classes.SiteRoleProvider"/>
</providers>
</roleManager>

نميدونم كجا ايراد داره .

profnami
جمعه 17 اردیبهشت 1389, 12:09 عصر
البته جسارتا مثل اين كه كلاس RoleProvider اجرا نميشه

z_bluestar
شنبه 18 اردیبهشت 1389, 09:07 صبح
ایراد این جاست

<add name="SiteRoleProvider" type="abcconstruct.Classes.SiteRoleProvider"/>

شمــا name space کلاسی که من براتون مثال زدم رو استفاده کردید "abcconstruct.Classes" لطفا name space رو تصیح کنید و با name space خودتون جایگزین کنید

profnami
یک شنبه 19 اردیبهشت 1389, 12:23 عصر
سلام مجدد خدمت دوستان . من باز هم موفق نشدم . يه بار كل كارهايي رو كه انجام ميدم ميگم شايد تو مراحل اول من اشتباه كرده باشم . در حالت خيلي ساده من براي كاربرهام يه جدول طراحي كردم با سه فيلد
Username , Password , Role
در هنگام ورود من چك ميكنم كه آيا
Username با Password
همخواني داره يا خير . بعد با استفاده از اين متد اون رو وارد سايت ميكنم :


FormsAuthentication.RedirectFromLoginPage(user.Tex t, false);

تا اينجا بدون مشكل من ميتونم كار كنم . در داخل فايل web.config هم نوشتم :


-->
<authentication mode="Forms">
<forms loginUrl="SignIn.aspx" defaultUrl="~/"></forms>
</authentication>


از اين به بعد طبق راهنمايي شما نوشتم :


<roleManager>
<providers>
<clear/>
<add name="SiteRoleProvider" type="SiteRoleProvider"/>
</providers>
</roleManager>

يه كلاس به اين اسم داخل پوشه ي App_Code دارم

اين هم محتوياتش :


using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

/// <summary>
/// Summary description for SiteRoleProvider
/// </summary>
public class SiteRoleProvider : RoleProvider
{
public SiteRoleProvider()
{
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override string ApplicationName
{
get{throw new NotImplementedException();}
set{throw new NotImplementedException();}
}

public override void CreateRole(string roleName)
{
throw new NotImplementedException();
}

public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
throw new NotImplementedException();
}

public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
throw new NotImplementedException();
}

public override string[] GetAllRoles()
{
throw new NotImplementedException();
}

public override string[] GetRolesForUser(string username)
{
string[] roles = new string[1];
try
{
string strCon = System.Web.Configuration.WebConfigurationManager.C onnectionStrings["conSite"].ConnectionString;
SqlConnection con = new SqlConnection(strCon);
string strCom = "SELECT Role FROM Users Where Username=@Username";
SqlCommand com = new SqlCommand(strCom, con);
com.Parameters.AddWithValue("@Username", username);
con.Open();
SqlDataReader dr = com.ExecuteReader();
roles[0] = dr["Role"].ToString();
dr.Close();
con.Close();
}
finally
{
}
return roles;
}

public override string[] GetUsersInRole(string roleName)
{
throw new NotImplementedException();
}

public override bool IsUserInRole(string username, string roleName)
{
throw new NotImplementedException();
}

public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
throw new NotImplementedException();
}

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}



داخل پوشه ي adminPanel هم همون كدهايي كه گفتيد گذاشتم

حالا من با اين متد كاربر رو هدايت ميكنم


Response.Redirect("adminPanel/Panel.aspx");

اما باز هم برگشت ميخوره:اشتباه: . وارد نميشه . چون role اضافه نشده .

ممنون

z_bluestar
یک شنبه 19 اردیبهشت 1389, 13:23 عصر
NameSpace کلاست چیه ؟؟
namespace abcconstruct.Classes
{

مشکـل کد تو معرفی کلاست تو roleProvider هست .

profnami
یک شنبه 19 اردیبهشت 1389, 16:02 عصر
راستش نميدونم . من اين كلاس رو توي پوشه ي app_code اضافه ميكنم . اونجا هم namespace نميبينم . فقط اسم كلاسهاست . منظورتون از namespace اسم خود website هست ؟

Vahid_moghaddam
یک شنبه 19 اردیبهشت 1389, 18:04 عصر
نه اسم website نیست. اینطوری بنویسید:
<font face="Tahoma"> <add name="SiteRoleProvider" type="SiteRoleProvider"/></font>

profnami
یک شنبه 19 اردیبهشت 1389, 19:42 عصر
ميشه يه خورده راجع به اين دستورتون توضيح بديد ؟

ehsanham
دوشنبه 20 اردیبهشت 1389, 01:41 صبح
سلام این لینکی که میدم رو حتما مطالعه کن.وب سایت یکی از اساتید همین فرومه
با vb نوشته شده البته فرقی نداره اما اگر خواستی من با c# هم دارم.
http://how2learnasp.net/article.aspx?code=85c9dd50-0935-48c2-9039-949da6b42f8d

bahareh1368
جمعه 21 بهمن 1390, 21:25 عصر
با سلام.
دوستان من عین همین کد و نوشتم و همه چیزش هم درسته. اما وقتی برنامه اجرا میشه و میخوام با نقش Administrator صفحه مدیریت کاربران یا هر صفحه ای که مربوط به مدیریته و فقط در اختیار مدیر سایت هست دسترسی داشته باشم ارور میده که نمی تونه کانکشن رو باز کنه.باید چیکار کنم؟
متن خطا اولیه اینه :




EntityExeption was unhandled by usercode
The underlying provider faild on open





و وقتیکه دوباره f5 میزنم خطای زیر رو میده
اینم تصویر خطا :

82386

لطفا بهم بگید چیکارکنم.

bahareh1368
شنبه 22 بهمن 1390, 16:17 عصر
دوستان کسی جواب سوال منو نمیدونه؟مشکل چیه

bahareh1368
شنبه 22 بهمن 1390, 22:57 عصر
دوستان کسی جواب سوال منو نمیدونه؟مشکل چیه

من از يكي از اساتيد در اين باره پرسيدم بهم گفتن مشكل از كد يا برنامه نيست اگه كامپيوتر را ريست كنم درست ميشه.

كسي راه حل ديگه يا نظر ديگه اي نداره در اين باره؟