آموزش کار با Role در MVC
یکشنبه 21 شهریور 1395هدف از این مقاله ، آموزش چگونگی ایجاد Role ، تغییر دادن Role ، حذف Role و مدیریت Role با استفاده از ASP.Net Identity در MVC برای یک کاربر خاص است .
معرفی :
ASP.Net Identity تقریبا همه ویژگی های مورد نیاز برای احراز هویت را فراهم میکند و اجازه قانونی (authorization) برای برنامه Asp.Net همچنین اضافه کردن یک Role جدید ، و انتساب آن به یک کاربر خاص ، به نظر میرسد که در تمام این ویژگی ها فراموش شده است . در این مقاله ما همه چیز را در مورد ایجاد Role ، تغییر دادن Role ، حذف Role و مدیریت Role برای یک کاربر خاص در ASP.Net MVC 5 را خواهیم آموخت .
مفروضات :
در این جا فرض ما بر این است که خواننده این مقاله اطلاعات ابتدایی در مورد ASP.Net MVC دارد و چگونگی کار با View , Controller و Entity Framework را میداند .
با مدیریت Role در ASP.Net Identity شروع میکنیم :
بصورت پیش فرض زمانی که یک برنامه ASP.NET MVC default اجرا میشود و migration خودکار روشن است ، ثبت نام یک کاربر بصورت خودکار جداولی را در پایگاه داده ایجاد میکند که عبارت اند از :
1. AspNetRoles - اطلاعات Role را ذخیره میکند و شامل ستون های Id و Name میباشد .
2. AspNetUsers - اطلاعات کاربر را ذخیره میکند و شامل ستونهای Id, UserName, PasswordHash, SecurityStamp و Discriminator میباشد .
3. AspNetUserRoles - شناسه(id) مربوط به کاربر و Role را ذخیره میکند و شامل ستون های UserId و RoleId میباشد .
توضیح و بررسی جدولهای دیگر در مورد بحث ما نیست و در این مُقال نمیگنجد .

به صورت پیش فرض ، ما کلاس پیش فرض Model را برای ASP.Net Identity که با جداول پایگاه داده در رابطه است ، در نظر نمیگیریم ، بنابراین ، نیاز است که View و Controller را بصورت دستی ایجاد کنیم . در این مورد ، ما فولدر Controller و View جدا برای Roleها داریم .
مفروضات برنامه :
در اینجا ، فرض ما بر این است که ما هم اکنون یک کلاس IdentityModels.cs در فولدر Models داریم که کدهای آن شبیه کدهای زیر است (در ASP.Net MVC 5 ، این بصورت خودکار ساخته میشود)
// You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
در تمام Action متدهای RolesController ، صفتی برای Authorize ، برای اینکه کدها را ساده و قابل فهم کند ، مورد استفاده قرار میگیرد
ایجاد یک Role جدید با ASP.NET Identity :
برای ایجاد یک Role جدید ، view و تکه کد زیر را داریم .

@{
ViewBag.Title = "Create";
}
<h2>Create Role</h2>
@Html.ActionLink("List Roles", "Index") | @Html.ActionLink("Manage User Role", "ManageUserRoles")
<hr/>
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<div>
Role name
</div>
<p>
@Html.TextBox("RoleName")
</p>
<input type="submit" value="Save" />
}
در تیکه کد بالا ، یک TextBox ساده با نام RoleName و یک فرم عمومی مرتبط با کد داریم لطفا توجه داشته باشید که در اینجا دایرکتیو model@ نداریم . متد Controller همانند زیر است :
Namespaceهایی که برای کار با Roleها نیاز است ، در زیر مشاهده میکنید :
using Microsoft.AspNet.Identity; using Microsoft.AspNet.Identity.EntityFramework;
متد Controller برای ایجاد View همانند زیر است :
// GET: /Roles/Create
public ActionResult Create()
{
return View();
}
//
// POST: /Roles/Create
[HttpPost]
public ActionResult Create(FormCollection collection)
{
try
{
context.Roles.Add(new Microsoft.AspNet.Identity.EntityFramework.IdentityRole()
{
Name = collection["RoleName"]
});
context.SaveChanges();
ViewBag.ResultMessage = "Role created successfully !";
return RedirectToAction("Index");
}
catch
{
return View();
}
}
اولین متد Create یک View ساده را بازمیگرداند ، دومین متد Create ، شئ FormCollection را به عنوان پارامتر میپذیرد و از شئ Context (نمونه ای از ApplicationDbContext) برای اضافه کردن Role به مجموعه Role ها ، استفاده میکنیم . توجه داشته باشید که ، نام جدول Roleها در پایگاه داده AspNetRoles و نام کلاس Model ما IdentityRole میباشد . فراخوانی متد SaveChange ، نقش(Role) جدید را در پایگاه داده ذخیره میکند .
فهرست Roleها با ASP.NET Identity :

فهرست بندی Roleها با استفاده از ASP.NET Identity ، کدهای View زیر را داریم :
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>
@{
ViewBag.Title = "Index";
}
<h2>Roles Listing </h2>
@Html.ActionLink("Create New Role", "Create") | @Html.ActionLink("Manage User Role", "ManageUserRoles")
<hr/>
<div>
@foreach (var role in Model)
{
<p><strong>@role.Name | </strong>
<span onclick="return confirm('Are you sure to delete?')"><a href="/Roles/Delete?RoleName=@role.Name" class="delLink" style="color:red;">Delete</a></span> |
@Html.ActionLink("Edit", "Edit", new { roleName = @role.Name })
</p>
}
</div>
در تکه کد بالا ، model این IdentityRole ، View است و در حلقه foreach ، همه role ها از مجموعه roleها لیست میشوند . زمانی که roleها فهرست شد ، همچنین یک link برای حذف و ویرایش یک role خاص ، ایجاد میکنیم .
متد Controller برای لیست کردن roleهای ASP.NetIdentity بصورت زیر است :
public ActionResult Index()
{
var roles = context.Roles.ToList();
return View(roles);
}
در تکه کد بالا ، مجموعه Roleها را از ApplicationDbContext دریافت میکنیم و آن را به View بازمیگردانیم .
حذف یک Role با استفاده از ASP.Net Identity :
کلیک کردن روی لینک delete در فهرست roleها ، باعث حذف یک Role خاص از پایگاه داده میشود و در اینجا یک Action متد برای این ، در RolesController وجود دارد .
public ActionResult Delete(string RoleName)
{
var thisRole = context.Roles.Where(r => r.Name.Equals(RoleName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
context.Roles.Remove(thisRole);
context.SaveChanges();
return RedirectToAction("Index");
}
ما Role انتخاب شده را از پایگاه داده انتخاب کردیم و متد Remove را از مجموعه Roleها فراخوانی کردیم . فراخوانی متد شئ
ApplicationDbContext ، نقش انتخابی را از پایگاه داده حذف میکند .
ویرایش Role با استفاده از ASP.NET Identity :

برای ویرایش Role ، کد زیر و view بالا را داریم :
@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole
@{
ViewBag.Title = "Edit";
}
<h2>Edit Role</h2>
@Html.ActionLink("List Roles", "Index") | @Html.ActionLink("Manage User Role", "ManageUserRoles")
<hr />
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(model => model.Id)
<div>
Role name
</div>
<p>
@Html.TextBoxFor(model => model.Name)
</p>
<input type="submit" value="Save" />
}
در کد بالا ، IdentityRole کلاس model ماست .
متد Edit در Contoller همانند زیر است :
//
// GET: /Roles/Edit/5
public ActionResult Edit(string roleName)
{
var thisRole = context.Roles.Where(r => r.Name.Equals(roleName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
return View(thisRole);
}
//
// POST: /Roles/Edit/5
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(Microsoft.AspNet.Identity.EntityFramework.IdentityRole role)
{
try
{
context.Entry(role).State = System.Data.Entity.EntityState.Modified;
context.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
در تکه کد بالا ، اولین متد roleName را به عنوان پارامتر میپذیرد و بر اساس آن ، ما role را از پایگاه داده بازیابی کرده و به view بازمیگردانیم .
دومین متد ، IdentityRoleرا به عنوان پارامتر دریافت میکند و رکورد را در پایگاه داده بروزرسانی میکند .
مدیریت Roleها برای یک کاربر خاص در ASP.NET Identity :
برای مدیریت Roleها برای یک کاربر خاص در ASP.NET Identity ، ما view زیر را داریم که دارای بیش از یک form میباشد :
1. یک role برای کاربر اضافه کنید .
2. roleها را برای کاربر گرفته و
3. Delete/Detach یک کاربر از یک نقش خاص

کد برای view بالا همانند زیر است :
@{
ViewBag.Title = "ManageUserRoles";
}
<h2>Manage User Roles</h2>
@Html.ActionLink("Create New Role", "Create") | @Html.ActionLink("Manage User Role", "ManageUserRoles")
<hr/>
<h2>Role Add to User</h2>
@using (Html.BeginForm("RoleAddToUser", "Roles"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
Username : @Html.TextBox("UserName")
Role Name: @Html.DropDownList("RoleName", (IEnumerable <SelectListItem>) ViewBag.Roles, "Select ...")
</p>
<input type="submit" value="Save" />
}
<hr/>
<h3>Get Roles for a User</h3>
@using (Html.BeginForm("GetRoles", "Roles"))
{
@Html.AntiForgeryToken()
<p>
Username : @Html.TextBox("UserName")
<input type="submit" value="Get Roles for this User" />
</p>
}
@if (ViewBag.RolesForThisUser != null)
{
<div style="background-color:yellow;">
<h3>Roles for this user </h3>
<ol>
@foreach (string s in ViewBag.RolesForThisUser)
{
<li>@s</li>
}
</ol>
</div>
}
<hr />
<h3>Delete A User from a Role</h3>
@using (Html.BeginForm("DeleteRoleForUser", "Roles"))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<p>
Username : @Html.TextBox("UserName")
Role Name: @Html.DropDownList("RoleName", (IEnumerable<SelectListItem>)ViewBag.Roles, "Select ...")
</p>
<input type="submit" value="Delete this user from Role" />
}
متد ManageUserRoles در Controller همانند زیر است :
public ActionResult ManageUserRoles()
{
// prepopulat roles for the view dropdown
var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr =>
new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
return View();
}
فهرست roleها را دریافت میکنیم و آن را روی ViewBag تنظیم میکنیم که برای DropDown ای که در view قرار دارد مورد استفاده قرار میگیرد .
اضافه کردن یک role به کاربر با استفاده از ASP.Net Identity :
اولین فرم دارای یک UserName TextBox و RoleName dropdown list است که شامل roleهایی که در پایگاه داده ما قرار دارد ، هست . Submit کردن فرم ، اطلاعات فرم را به Action متد ِ RolesController ، RoleAddToUser ارسال میکند .
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult RoleAddToUser(string UserName, string RoleName)
{
ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var account = new AccountController();
account.UserManager.AddToRole(user.Id, RoleName);
ViewBag.ResultMessage = "Role created successfully !";
// prepopulat roles for the view dropdown
var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
return View("ManageUserRoles");
}
در متد بالا ، UserName و RoleName را به عنوان پارامتر دریافت میکنیم .
UserName برای گرقتن ApplicationUser از Context مورد استفاده قرار میگیرد . مجموعه کاربران ، سپس
شئ AccountController برای پردازش property شئ UserManager مورد استفاده قرار میگیرد و متد AddToRole را بوسیله ارسال UserId از شئ ApplicationUser ، فراخوانی میکند و RoleName به درون فرم میآید .
چند خط باقی مانده برای لیست کردن role ها در DropDown است .
گرفتن Roleها برای یک کاربر در ASP.Net Identity :

در فرم دوم ، ما یک UserName TextBox و یک button داریم . کلیک کردن روی button فرم را برای Action متد GetRoles ارسال میکند .
متد Controller ، GetRoles ما همانند زیر است :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult GetRoles(string UserName)
{
if (!string.IsNullOrWhiteSpace(UserName))
{
ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
var account = new AccountController();
ViewBag.RolesForThisUser = account.UserManager.GetRoles(user.Id);
// prepopulat roles for the view dropdown
var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
}
return View("ManageUserRoles");
}
حذف یک کاربر از یک Role :
در فرم سوم ، ما یک UserName TextBox و یک RoleName dropdown list داریم . کلیک کردن بر روی Button فرم را به action متد DeleteRoleForUser ارائه میدهد ، و تکه کد های زیر مربوط به این است :
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult DeleteRoleForUser(string UserName, string RoleName)
{
var account = new AccountController();
ApplicationUser user = context.Users.Where(u => u.UserName.Equals(UserName, StringComparison.CurrentCultureIgnoreCase)).FirstOrDefault();
if (account.UserManager.IsInRole(user.Id, RoleName))
{
account.UserManager.RemoveFromRole(user.Id, RoleName);
ViewBag.ResultMessage = "Role removed from this user successfully !";
}
else
{
ViewBag.ResultMessage = "This user doesn't belong to selected role.";
}
// prepopulat roles for the view dropdown
var list = context.Roles.OrderBy(r => r.Name).ToList().Select(rr => new SelectListItem { Value = rr.Name.ToString(), Text = rr.Name }).ToList();
ViewBag.Roles = list;
return View("ManageUserRoles");
}
در تکه بالا ، ما ApplicationUser را دریافت میکنیم و سپس چک میکنیم که آیا این کاربر ارتباطی با Role انتخاب شه دارد یا نه ، اگر دارد ، متد RemoveFromRole با ارسال پارامترهای UserId و RoleName ، فراخوانی میشود ، که کاربر را از Role حذف میکند .
نتیجهگیری :
ما در این مقاله ، چگونگی توسعه یک رابطه کاربری برای ایجاد یک Role جدید ، ویرایش آن ، حذف آن ، ضمیمه کردن یک View Role به یک کاربر خاص و مدیریت یک role برای یک کاربر خاص توسط ASP.Net Identity در
ASP.Net MVC را آموختیم .
امیدواریم که این مقاله برای شما مفید واقع شده باشد .
آموزش asp.net mvc
- ASP.net MVC
- 4k بازدید
- 10 تشکر