PDA

View Full Version : مبتدی: محدودیت دسترسی برای پوشه یا صفحات خاص با استفاده از RoleProvider



omidi2008
شنبه 29 آبان 1395, 16:28 عصر
با سلام
چطور میشه برای پوشه یا صفحات خاص محدودیت دسترسی با استفاده ار rol قرار داد؟
یه کلاس MyRoleProvider ساختم که از دیتا بیس رول ها رو میخونه:
public override string[] GetRolesForUser(string username)
{
او پارامتر username چطور به تابع پاس داده میشه.
کد زیر رو تو config ریشه سایت:
<roleManager enabled="true" defaultProvider="MyRoleProvider" cacheRolesInCookie="true" cookieName="userName">
<providers>
<clear/>
<add name="MyRoleProvider" type="a.MyRoleProvider"/>
</providers>
</roleManager>
و کد زیر رو تو کانفیگ پوشه مورد نظر گذاشتم:
<authorization>
<allow roles="Admin_ostan, Customer"/>
<deny users="?"/>
</authorization>

دیگه باید چیکار کنم؟؟؟
ممنون میشم راهنمایی کنید.کلا گیج شدم!

omidi2008
یک شنبه 30 آبان 1395, 14:05 عصر
کسی میتونه کمکی کنه؟

hjalalat
یک شنبه 11 تیر 1396, 18:41 عصر
ابتدا باید جداول نقش وکاربر را با استفاده از فریمورک انتیتی ساخته شود.برای این کار باید مراحل زیر را انجام دهیم
1.ایجاد DatabaseContext در Models

using Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace Models
{
public class DataBaseContext:DbContext
{
static DataBaseContext()
{



Database.SetInitializer
(new System.Data.Entity.DropCreateDatabaseIfModelChange s<DataBaseContext>());


}
public DataBaseContext() : base()
{

}
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }

}
}
2.ایجاد کلاس BaseEntity در Models
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
public class BaseEntity
{
public BaseEntity() : base()
{
Id = Guid.NewGuid();
}

public Guid Id { get; set; }
}
}

3.ایجاد کلاس نقش در Models
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
public class Role:BaseEntity
{
public Role() : base()
{

}
public string Name { get; set; }
public virtual IList<User> Users { get; set; }
}
}
4.ساخت کلاس کاربر در Models
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Models
{
public class User:BaseEntity
{
public User() :base()
{
}


// **********
public string Name { get; set; }
// **********

// **********
public string Password { get; set; }
// **********

// **********
public DateTime DataCreate { get; set; }
// **********

public virtual IList<Role> Roles { get; set; }
}
}

سپس یک کلاس در هر جای پروز فرق نمی کنه کجا باشد اضافه میکنیم . برای مرتب بودن بهتر است یک فولدر به نام Security در روت پروژه ایجاد کنید سپس کلاس CustomRoleProvider را در آن اضافه کنید دقت داشته باشید این کلاس هر نامی می تونه داشته باشه ولی حتما باید از کلاس انتزاعی (abstract) به نام System.Web.Security.RoleProvider به ارث برود . کد زیر را کپی و در کلاس CustomRoleProvider جایگزین کنید احتیاجی به پیاده سازی ندارید

using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace HJ_Template_MVC.Security
{
public class CustomRolesProvider:RoleProvider
{
private DataBaseContext db = new DataBaseContext();
public CustomRolesProvider() : base()
{

}

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()
{
return db.Roles.Select(r => r.Name).ToArray();
}

public override string[] GetRolesForUser(string username)
{
var Role = db.Users
.Where(r => r.Name == username)
.SelectMany(x => x.Roles)
;
var re = Role.Select(C => C.Name).ToArray();
return re;
}

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

public override bool IsUserInRole(string username, string roleName)
{
var user = db.Users.SingleOrDefault(u => u.Name == username);
var userRoles = db.Roles.Select(r => r.Name);

if (user == null)
return false;
return user.Roles != null &&
userRoles.Any(r => r == roleName);
}

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

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}
مرحله بعد کافی به Web.Config ودر داخل تگ <system.web> این تگ را اضافه کنیم

<roleManager enabled="true" defaultProvider="CustomRolesProvider" cacheRolesInCookie="false">
<providers>
<clear/>
<add name="CustomRolesProvider" type=" Security.CustomRolesProvider" />
</providers>
</roleManager>
اکنون شما میتونید با استفاده از [Authorize] در کنترلر تعیین کنید دسترسی به کاربر یا نقش را بدید یا بگرید برای مثال:
[Authorize(Roles ="Admin",Users ="jalalat")]ابتدا باید جداول نقش وکاربر را با استفاده از فریمورک انتیتی ساخته شود.برای این کار باید مراحل زیر را انجام دهیم
1.ایجاد DatabaseContext در Models
using Models;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Web;

namespace Models
{
public class DataBaseContext:DbContext
{
static DataBaseContext()
{


// فقط به درد برنامه نويسان آنهم در زمان پياده سازی می خورد
//اگر تغییری روی مدل بدهیم پاک میکنه از اول می سازه
Database.SetInitializer
(new System.Data.Entity.DropCreateDatabaseIfModelChange s<DataBaseContext>());


}
public DataBaseContext() : base()
{

}
public DbSet<User> Users { get; set; }
public DbSet<Role> Roles { get; set; }

}
}
2.ایجاد کلاس BaseEntity در Models
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
public class BaseEntity
{
public BaseEntity() : base()
{
Id = Guid.NewGuid();
}

public Guid Id { get; set; }
}
}

3.ایجاد کلاس نقش در Models
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Models
{
public class Role:BaseEntity
{
public Role() : base()
{

}
public string Name { get; set; }
public virtual IList<User> Users { get; set; }
}
}
4.ساخت کلاس کاربر در Models
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Models
{
public class User:BaseEntity
{
public User() :base()
{
}


// **********
public string Name { get; set; }
// **********

// **********
public string Password { get; set; }
// **********

// **********
public DateTime DataCreate { get; set; }
// **********

public virtual IList<Role> Roles { get; set; }
}
}
سپس یک کلاس در هر جای پروز فرق نمی کنه کجا باشد اضافه میکنیم . برای مرتب بودن بهتر است یک فولدر به نام Security در روت پروژه ایجاد کنید سپس کلاس CustomRoleProvider را در آن اضافه کنید دقت داشته باشید این کلاس هر نامی می تونه داشته باشه ولی حتما باید از کلاس انتزاعی (abstract) به نام System.Web.Security.RoleProvider به ارث برود . کد زیر را کپی و در کلاس CustomRoleProvider جایگزین کنید احتیاجی به پیاده سازی ندارید

using Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;

namespace HJ_Template_MVC.Security
{
public class CustomRolesProvider:RoleProvider
{
private DataBaseContext db = new DataBaseContext();
public CustomRolesProvider() : base()
{

}

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()
{
return db.Roles.Select(r => r.Name).ToArray();
}

public override string[] GetRolesForUser(string username)
{
var Role = db.Users
.Where(r => r.Name == username)
.SelectMany(x => x.Roles)
;
var re = Role.Select(C => C.Name).ToArray();
return re;
}

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

public override bool IsUserInRole(string username, string roleName)
{
var user = db.Users.SingleOrDefault(u => u.Name == username);
var userRoles = db.Roles.Select(r => r.Name);

if (user == null)
return false;
return user.Roles != null &&
userRoles.Any(r => r == roleName);
}

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

public override bool RoleExists(string roleName)
{
throw new NotImplementedException();
}
}
}
مرحله بعد کافی به Web.Config ودر داخل تگ <system.web> این تگ را اضافه کنیم
<roleManager enabled="true" defaultProvider="CustomRolesProvider" cacheRolesInCookie="false">
<providers>
<clear/>
<add name="CustomRolesProvider" type=" Security.CustomRolesProvider" />
</providers>
</roleManager>
اکنون شما میتونید با استفاده از [Authorize] در کنترلر تعیین کنید دسترسی به کاربر یا نقش را بدید یا بگرید برای مثال:

[Authorize(Roles ="Admin",Users ="jalalat")]

hjalalat
یک شنبه 11 تیر 1396, 18:43 عصر
اگر کل کدم بصورت یکجا می خواهید باشه به آدرس زیر مراجعه کنید

https://github.com/jalalathamid