مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

مشکل در احراز هویت و مدیریت نقش ها

  • سه شنبه 30 شهریور 1395
  • 13:04
تشکر میکنم

سلام خدمت اساتید محترمheart

یه فولدر توی پروژم ساختم به اسم 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>

 

حالا وقتی اجرا میکنم این خطا رو میده

 

از اساتید محترم خواهش میکنم راهنمایی کنن یا اگه راه ساده تری سراغ دارن بگن از اون راه بریم جلو من دارم از دیتا ست استفاده میکنم

ممنون

پاسخ های این پرسش

تعداد پاسخ ها : 24 پاسخ
کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • سه شنبه 30 شهریور 1395
  • 17:12

فکر کنم توی وب کانفیگ قسمت 


<roleManager enabled="true" defaultProvider="MyProv">
      <providers>
        <clear/>
        <add name="MyProv" type="MyProv"/>
      </providers>
    </roleManager>

type این قسمت رو 

<add name="MyProv" type="MyProv"/> 

دارم اشتباه وارد میکنم و هرطور دیگه هم واردش میکنم بازم همین خطا رو میده لطفا راهنمایی کنید

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:04

چرا از خود RoleProvider در Dotnet استفاده نکردید

وظیفه اش همینه بررسی نقش ها

تخصیص نقش ها به کاربران بر اساس احراز هویت در Asp.Net

اهراز هویت و مدیریت نقش ها در ASP.Net

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 09:13
ممنون داداش ولی هرکار کردم aspnet_regsql.ex پیدا نمیشه
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:20

از چه ورژن از ویژوال استادیو استفاده میکنید ؟

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 09:32
Visual 2015 میخوام ویندوز عوض کنم به نظرتون بعدا کدوم ورژن رو نصب کنم
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:34

همین نسخه خوبه

نیازی نیست شما جداول رو بسازید از RoleProvider ارث بری کنید و متد هاش رو پیاده سازی کنید

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 09:41
یعنی به صورت ویزاردی در قسمت ASP.NET Configuration استفاده کنم؟ این گزینه هم توی منوی Website نیست
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:43

خیر

شما جداول مربوط به خدتون رو دارید

یک کلاس بسازید و از RoleProvider ارث بری کنید و بعد متدهایی که میسازه را پر کنید

متد اصلی GetRoleForUser است

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 09:48

همین کارو کردم داداش کلاس MyProv که توی پروژمه همینطوری ساختم ولی با خطا های بالا مواجه شدم

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:50

کد کلاس Provider را قرار  دهید

کامل

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 09:54

داداش این کد کلاس 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();
    }
}

 

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 09:56

RoleManager را در وبکافیگ enable کردید ؟

متن خطا میگه فعال نیست

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 10:00

اره داداش فعاله اینم کد وب کانفیگ

<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>

 

که الان داره این خطا رو میده

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 31 شهریور 1395
  • 10:05

در Type با از فضای نام NameSpace آدرس بدید

نام کلاس به تنهایی کفایت نمیکنه

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 10:20

الان این متود ها همشونو توی یه فضای نام قرار دادم به اسم 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>

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 10:24

بعد یه چی دیگه ، من پروژم وب اپلیکیشن نیست اینطوری پروژمو ایجاد کردم

File>>New>>Website

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 31 شهریور 1395
  • 10:32

داداش اینم کل پروژم

فایل های ضمیمه

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • پنجشنبه 1 مهر 1395
  • 10:34

داداش بررسی شد ببینین مشکلم از کجاست؟

ممنون

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • پنجشنبه 1 مهر 1395
  • 10:41

در اسرع وقت بررسی خواهم کرد

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • پنجشنبه 1 مهر 1395
  • 11:32

باشه داداش ممنون منتظرتون هستم

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • جمعه 2 مهر 1395
  • 21:26

داداش بررسی کردین؟

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • یکشنبه 4 مهر 1395
  • 15:21

ایا کسی هست مشکل مارو حل کنه frown

کاربر سایت

omid yeganeh

عضویت از 1393/05/31

  • چهارشنبه 7 مهر 1395
  • 14:22

سلام داداش هنوز وقت نکردی مشکل مارو حل کنی؟

وقتم داره برا تحویل پروژه تموم میشه لطفا اگه میشه یه راهنمایی کنید

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 7 مهر 1395
  • 14:28

من معمولا با تبلت جواب سوالات رو میدم و امکان دانلود نمونه را ندارم

متد GetRoles را Trace کنید ببینید نقش را درست برمیگردونه ؟

اگر اصلا ب اون نرسه باید مشکل در فعال کردن Rolemanager در Web.Config باشه

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)