پردازش یک برنامه MVC برمبنای نقش ها
پنجشنبه 25 شهریور 1395در این مقاله ، چگونگی پردازش بر مبنای نقش ها در MVC را نشان خواهیم داد ... بدین منظور که ، کاربرها در یک سایت دسترسی های متفاوتی به صفحات مختلف داشته باشند . در این مقاله ما مثالی را بررسی خواهیم کرد که دسترسی های یک کاربر ویژه و کاربر معمولی و دسترسی های آنها را نشان خواهد داد .
این بدان معناست که ، اگر یکسری صفحات مرتبط با مدیریت دارید ، آنگاه فقط کاربرانی که نقش مدیر دارند توانایی پردازش این صفحات را دارند . برای این نمودار زیر را داریم :
حال ، Visual Studio را باز کنید و یک پروژه جدید ایجاد کنید .
همانطور که در زیر نمایش داده شده است ، برای نقش و کاربران از پایگاه داده پیش فرض استفاده میکنیم :
حال ، ما برای مدیریت نقشها ، یعنی ایجاد یک نقش جدید و مشاهده تمام نقشها ، کد مینویسیم ، برای این کار یک Controller به پروژه اضافه کنید :
کد های زیر را در RoleController قرار دهید :
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using RoleBasedAppAccess.Models; using Microsoft.AspNet.Identity.EntityFramework; namespace RoleBasedAppAccess.Controllers { public class RoleController : Controller { ApplicationDbContext context; public RoleController() { context = new ApplicationDbContext(); } /// <summary> /// Get All Roles /// </summary> /// <returns></returns> public ActionResult Index() { var Roles = context.Roles.ToList(); return View(Roles); } /// <summary> /// Create a New role /// </summary> /// <returns></returns> public ActionResult Create() { var Role = new IdentityRole(); return View(Role); } /// <summary> /// Create a New Role /// </summary> /// <param name="Role"></param> /// <returns></returns> [HttpPost] public ActionResult Create(IdentityRole Role) { context.Roles.Add(Role); context.SaveChanges(); return RedirectToAction("Index"); } } }
در اینجا ما از ASP.NEt Identity استفاده میکنیم :
حال ، View متد Index را اضافه کنید :
به View بروید و کدهای زیر را در فایل Index.cshtml :
@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole> @{ ViewBag.Title = "Manage Role"; } <h2>Manage Role</h2> <table><tr><td style="height:20px;"></td></tr></table> <table id="tbrole" style="width:30%; border:solid 4px red; background-color:skyblue; padding-left:10px;"> <tr> <td style="background:green; color:white; padding:10px;"> Role Name </td> </tr> @foreach (var item in Model) { <tr> <td style="padding:10px; border-bottom:1px solid #ff006e;"> @item.Name </td> </tr> } </table> <table> <tr><td style="height:20px;"></td></tr> <tr> <td style="height:20px; text-align:right;"> @Html.ActionLink("Add New Role", "Create", "Role") </td> </tr> </table>
حال ، برای متد Create در View ، RoleController ای را اضافه میکنیم .
کدهای زیر را در Create.cshtml قرار دهید :
@model Microsoft.AspNet.Identity.EntityFramework.IdentityRole @{ ViewBag.Title = "Add New Role"; } <h2>Add New Role:</h2> <style type="text/css"> #tbrole, .c { border: double; } </style> @using (Html.BeginForm()) { <table style="width:40%; border:solid 4px red; background-color:skyblue; padding:10px;"> <tr> <td style="background:green; color:white; padding:10px;">Role Name:</td> <td style="background:green; color:white; padding:10px;"> @Html.EditorFor(m => m.Name) </td> </tr> <tr><td style="height:20px;" colspan="2"></td></tr> <tr><td></td><td><input type="submit" value="Create Role" /></td></tr> <tr><td style="height:20px;" colspan="2"></td></tr> </table> }
در view فولدر shared را باز کنید و در Layout.cshtml_ یک لینک به Manage role قرار دهید :
<div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("Manage Role", "Index", "Role")</li> </ul> @Html.Partial("_LoginPartial") </div>
حال برنامه را اجرا کنید :
روی مدیریت نقش کلیک کرده و نقش هایی جدید با نام Administrator و User ایجاد کنید .
بعد از ایجاد نقش ها داریم :
حال ، در تصویر زیر نقش ها را در پایگاه داده ASP.Net خود میبینیم :
حال ، به AccountController بروید ،
یک نمونه از ApplicationDbContext همانطور که در تکه کد زیر نمایش داده شده است :
ApplicationDbContext context; public AccountController() { context = new ApplicationDbContext(); }
در اینجا ، زمانی که یک کاربر جدید اضافه میکنیم ، نقش آن را نیز مشخص میکنیم ، نقش ها را در یک Dropdown نمایش میدهیم :
// GET: /Account/Register [AllowAnonymous] public ActionResult Register() { ViewBag.Name = new SelectList(context.Roles.ToList(), "Name", "Name"); return View(); }
در اینجا ما تغییراتی را اعمال کردیم و به register یک dropdown اضافه کردیم :
حال به Register.cshtml ، View در زیر شاخه Account بروید :
@model RoleBasedAppAccess.Models.RegisterViewModel @{ ViewBag.Title = "Register"; } <h2>@ViewBag.Title.</h2> @using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" })) { @Html.AntiForgeryToken() <h4>Create a new account.</h4> <hr /> @Html.ValidationSummary("", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.TextBoxFor(m => m.Email, new { @class = "form-control" }) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.Password, new { @class = "form-control" }) </div> </div> <div class="form-group"> @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" }) </div> </div> <!--Select the Role Type for the User--> <div class="form-group"> @Html.Label("Select Your User Type", new { @class = "col-md-2 control-label" }) <div class="col-md-10"> @*@Html.DropDownList("Name")*@ @Html.DropDownList("Name", (SelectList)ViewBag.Name, "--Choose Role--") </div> </div> <!--Ends Here--> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" class="btn btn-default" value="Register" /> </div> </div> } @section Scripts { @Scripts.Render("~/bundles/jqueryval") }
Controller آن را هم بروزرسانی میکنیم :
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> Register(RegisterViewModel model) { if (ModelState.IsValid) { var user = new ApplicationUser { UserName = model.Email, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded) { //Assign Role to user Here await this.UserManager.AddToRoleAsync(user.Id, model.Name); //Ends Here await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false); return RedirectToAction("Index", "Home"); } AddErrors(result); } // If we got this far, something failed, redisplay form return View(model); }
برنامه را اجرا کنید و روی "ثبت نام" کلیک کنید :
حال ، ثبت نام میکنیم :
حال ، داده ها را در Server Explorer مشاهده میکنیم :
AspNetUsers :
حال ، ما در برنامه ی خود دو صفحه داریم :
ما برای صفحات مدیر ، دسترسی مدیر و برای صفحات معمولی دسترسی معمولی میخواهیم، ما برای دسترسی به این دو صفحه در header لینک قرار میدهیم :
برای این کار یک فولدر با نام CustomFilters ایجاد میکنیم و کلاس AuthLogAttribute.cs را در آن ایجاد میکنیم و کدهای زیر را در آن مینویسیم :
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace RoleBasedAppAccess.CustomFilters { public class AuthLogAttribute : AuthorizeAttribute { public AuthLogAttribute() { View = "AuthorizeFailed"; } public string View { get; set; } /// <summary> /// Check for Authorization /// </summary> /// <param name="filterContext"></param> public override void OnAuthorization(AuthorizationContext filterContext) { base.OnAuthorization(filterContext); IsUserAuthorized(filterContext); } /// <summary> /// Method to check if the user is Authorized or not /// if yes continue to perform the action else redirect to error page /// </summary> /// <param name="filterContext"></param> private void IsUserAuthorized(AuthorizationContext filterContext) { // If the Result returns null then the user is Authorized if (filterContext.Result == null) return; //If the user is Un-Authorized then Navigate to Auth Failed View if (filterContext.HttpContext.User.Identity.IsAuthenticated) { // var result = new ViewResult { ViewName = View }; var vr = new ViewResult(); vr.ViewName = View; ViewDataDictionary dict = new ViewDataDictionary(); dict.Add("Message", "Sorry you are not Authorized to View this Page"); vr.ViewData = dict; var result = vr; filterContext.Result = result; } } } }
حال دو تا Controller اضافه میکنیم :
1. Admin
2. Users
برای دو Controller ای که ایجاد کردید view را اضافه کنید:
حال "مجوز دسترسی" را تنظیم میکنیم ، AdminController را باز میکنیم و کدهای زیر را در آن قرار دهید :
UserController :
حال Layout.cshtml_ را باز کنید ، و لینک آن دوصفحه را برای دسترسی به آنها در View قرار دهید :
<div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li>@Html.ActionLink("Manage Role", "Index", "Role")</li> <li>@Html.ActionLink("ADMIN PAGE", "Index", "Admin")</li> <li>@Html.ActionLink("USER PAGE", "Index", "Users")</li> </ul> @Html.Partial("_LoginPartial") </div>
حال برنامه را اجرا کنید :
روی "صفحه ادمین" کلیک کنید :
آموزش asp.net mvc
- ASP.net MVC
- 2k بازدید
- 3 تشکر