سلام خدمت اساتید محترم
یه فولدر توی پروژم ساختم به اسم Administrator و صفحات مدیریت داخلش هست
دوتا جدول دیتا بیس به نام های Users , Roles دارم و در جدول
دوتا نقش توی جدول Roles تعریف کردم به نام های Admin , Customer
میخوام فقط اون یوزر هایی که نقش ادمین بهشون میدم به محض لاگین کردن هدایت بشن به صفحه مدیریت و یوزر های معمولی که Customer هستن به محض لاگین کردن برن به صفحه پروفایل. الان من اینطوری نوشتم کد ها رو این خطا ها رو میده لطفا راهنمایی کنید یا اگه روش ساده تری دارین بگید ممنون.
این متود چک لاگین صفحه لاگین
protected bool CheckLogin(string UserName, string Password) { string c = WebConfigurationManager.ConnectionStrings["DataBaseConnectionString"].ConnectionString; SqlConnection cn = new SqlConnection(c); string str = "select * from Users where UserName=@u and Password=@p"; SqlCommand cmd = new SqlCommand(str, cn); cmd.Parameters.AddWithValue("@u", txtUserName.Text); cmd.Parameters.AddWithValue("@p", txtPassword.Text); SqlDataAdapter da = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); da.Fill(dt); if (dt.Rows.Count==1) { return true; } return false; }
اینم کد رخداد کلیک دکمه لاگین
protected void btnLogin_Click(object sender, EventArgs e) { if (Page.IsValid) { FormsAuthentication.SetAuthCookie(txtUserName.Text, chbRememberMe.Checked); if (Roles.GetRolesForUser(txtUserName.Text)[0]=="Admin") { Response.Redirect("~/Administrator/Manager.aspx"); } if (Roles.GetRolesForUser(txtUserName.Text)[0] == "Customer") { Response.Redirect("~/Default.aspx"); } } }
اینم کدی که توی وب کانفیگ فولدر ادمین گداشتم
<?xml version="1.0"?> <configuration> <system.web> <authorization> <allow roles="Admin"/> <deny users="*"/> </authorization> </system.web> </configuration>
یه کلاس به اسم MyProv ساختم در متود GetRolesForUser کد زیر رو نوشتم
public override string[] GetRolesForUser(string username)
{
SqlDataReader reader;
SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DataBase"].ToString());
connection.Open();
string MyQuery = "SELECT RoleName FROM Users INNER JOIN Roles ON" +
" Users.UserName=@UserName AND Users.RoleId_FK=Roles.RoleId";
SqlCommand cmd = new SqlCommand(MyQuery, connection);
cmd.Parameters.AddWithValue("Username", username);
reader = cmd.ExecuteReader();
reader.Read();
string[] result = new string[1];
result[0] = reader["RoleName"].ToString();
return result;
}
حالا اگه یوزر پسورد اشتباه وارد کنم که خطای نادرست بودن پسورد میده ولی اگه درست وارد کنم این خطا رو میده
بعد در قسمت وب کانفیگ این کد رو اضافه کردم
<roleManager enabled="true" defaultProvider="MyProv">
<providers>
<clear/>
<add name="MyProv" type="MyProv"/>
</providers>
</roleManager>
حالا وقتی اجرا میکنم این خطا رو میده
از اساتید محترم خواهش میکنم راهنمایی کنن یا اگه راه ساده تری سراغ دارن بگن از اون راه بریم جلو من دارم از دیتا ست استفاده میکنم
ممنون
فکر کنم توی وب کانفیگ قسمت
<roleManager enabled="true" defaultProvider="MyProv"> <providers> <clear/> <add name="MyProv" type="MyProv"/> </providers> </roleManager>
type این قسمت رو
<add name="MyProv" type="MyProv"/>
دارم اشتباه وارد میکنم و هرطور دیگه هم واردش میکنم بازم همین خطا رو میده لطفا راهنمایی کنید
چرا از خود RoleProvider در Dotnet استفاده نکردید
وظیفه اش همینه بررسی نقش ها
از چه ورژن از ویژوال استادیو استفاده میکنید ؟
همین نسخه خوبه
نیازی نیست شما جداول رو بسازید از RoleProvider ارث بری کنید و متد هاش رو پیاده سازی کنید
خیر
شما جداول مربوط به خدتون رو دارید
یک کلاس بسازید و از RoleProvider ارث بری کنید و بعد متدهایی که میسازه را پر کنید
متد اصلی GetRoleForUser است
همین کارو کردم داداش کلاس MyProv که توی پروژمه همینطوری ساختم ولی با خطا های بالا مواجه شدم
کد کلاس Provider را قرار دهید
کامل
داداش این کد کلاس MyProv هست
using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.Linq; using System.Web; using System.Web.Security; /// <summary> /// Summary description for MyProv /// </summary> /// public class MyProv : RoleProvider { public MyProv() { // // TODO: Add constructor logic here // } public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override void AddUsersToRoles(string[] usernames, string[] roleNames) { 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) { SqlDataReader reader; SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DataBase"].ToString()); connection.Open(); string MyQuery = "SELECT RoleName FROM Users INNER JOIN Roles ON" + " Users.UserName=@UserName AND Users.RoleId_FK=Roles.RoleId"; SqlCommand cmd = new SqlCommand(MyQuery, connection); cmd.Parameters.AddWithValue("Username", username); reader = cmd.ExecuteReader(); reader.Read(); string[] result = new string[1]; result[0] = reader["RoleName"].ToString(); return result; } 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(); } }
RoleManager را در وبکافیگ enable کردید ؟
متن خطا میگه فعال نیست
اره داداش فعاله اینم کد وب کانفیگ
<configuration> <connectionStrings> <add name="DataBaseConnectionString" connectionString="Data Source=ACER;Initial Catalog=DataBase;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> <system.web> <compilation debug="true" targetFramework="4.5" /> <httpRuntime targetFramework="4.5" /> <authentication mode="Forms"> <forms name=".ASPXAUTH" loginUrl="~/Login.aspx" timeout="130000" cookieless="AutoDetect" defaultUrl="~/Administrator/Manager.aspx" slidingExpiration="true"/> </authentication> <roleManager enabled="true" defaultProvider="MyProv"> <providers> <add name="MyProv" type="MyProv"/> </providers> </roleManager> </system.web> <!--WebForms UnobtrusiveValidationModeخطای صفحهی لاگین--> <appSettings> <add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/> </appSettings> <!--WebForms UnobtrusiveValidationModeخطای صفحهی لاگین--> </configuration>
که الان داره این خطا رو میده
در Type با از فضای نام NameSpace آدرس بدید
نام کلاس به تنهایی کفایت نمیکنه
الان این متود ها همشونو توی یه فضای نام قرار دادم به اسم pکدش این شد
namespace p { public class MyProv : RoleProvider { public MyProv() { // // TODO: Add constructor logic here // } public override string ApplicationName { get { throw new NotImplementedException(); } set { throw new NotImplementedException(); } } public override void AddUsersToRoles(string[] usernames, string[] roleNames) { 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) { SqlDataReader reader; SqlConnection connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DataBase"].ToString()); connection.Open(); string MyQuery = "SELECT RoleName FROM Users INNER JOIN Roles ON" + " Users.UserName=@UserName AND Users.RoleId_FK=Roles.RoleId"; SqlCommand cmd = new SqlCommand(MyQuery, connection); cmd.Parameters.AddWithValue("Username", username); reader = cmd.ExecuteReader(); reader.Read(); string[] result = new string[1]; result[0] = reader["RoleName"].ToString(); return result; } 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(); } } }
کد وب کانفیگ هم در قسمت RoleProvider اینطوری type رو وارد کردم
<roleManager enabled="true" defaultProvider="p.MyProv"> <providers> <add name="MyProv" type="MyProv"/> </providers> </roleManager>
بعد یه چی دیگه ، من پروژم وب اپلیکیشن نیست اینطوری پروژمو ایجاد کردم
File>>New>>Website
داداش بررسی شد ببینین مشکلم از کجاست؟
ممنون
در اسرع وقت بررسی خواهم کرد
باشه داداش ممنون منتظرتون هستم
داداش بررسی کردین؟
ایا کسی هست مشکل مارو حل کنه
سلام داداش هنوز وقت نکردی مشکل مارو حل کنی؟
وقتم داره برا تحویل پروژه تموم میشه لطفا اگه میشه یه راهنمایی کنید
من معمولا با تبلت جواب سوالات رو میدم و امکان دانلود نمونه را ندارم
متد GetRoles را Trace کنید ببینید نقش را درست برمیگردونه ؟
اگر اصلا ب اون نرسه باید مشکل در فعال کردن Rolemanager در Web.Config باشه
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)