پردازش یک برنامه MVC برمبنای نقش ها

پنجشنبه 25 شهریور 1395

در این مقاله ، چگونگی پردازش بر مبنای نقش ها در MVC را نشان خواهیم داد ... بدین منظور که ، کاربرها در یک سایت دسترسی های متفاوتی به صفحات مختلف داشته باشند . در این مقاله ما مثالی را بررسی خواهیم کرد که دسترسی های یک کاربر ویژه و کاربر معمولی و دسترسی های آنها را نشان خواهد داد .

پردازش یک برنامه 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

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

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید