ایجاد امنیت و نقش کاربر در MVC

پنجشنبه 27 خرداد 1395

در این مقاله خواهیم دید که چگونه از ASP.NET Identity در برنامه MVC برای ایجاد نقش کاربرها و نمایش منوی مربوط به نقش کاربر استفاده کنیم.

ایجاد امنیت و نقش کاربر در MVC

در اینجا خواهیم دید که چگونه :

- ایجاد نقش پیش فرض admin و نقش های دیگر

- ایجاد کاربرهای پیش فرض Admin

- اضافه کردن نام کاربری ، برای ثبت نام کاربر

- انتخاب نقش کاربر در هنگام ثبت نام

- نمایش منوی ایجاد شده نقش ها فقط برای کاربر Admin

- نمایش پیغام برای کاربر عادی

- تغییر مسیر کاربران احراز هویت نشده ، به صفحه اصلی

احرازهویت وتعیین سطح دسترسی

احراز هویت معتبر بودن کاربر را بررسی می کند.در این جا این سوال پیش می آید که چگونه بررسی می کند که کاربر معتبر است یا نه .زمانی که یک کاربربرای اولین بار  وارد سایت می شود ، در سایت ثبت نام می کند . همه ی اطلاعات کاربر ،مانند نام کاربری ، رمز عبور،ایمیل و ... دردیتابیس سایت ذخیره می شود.زمانی که کاربر UserID و رمز عبور خودش را می زند، اطلاعات با دیتابیس بررسی می شود.اگر کاربر UserID و رمز عبور مشابه آن که در دیتابیس ذخیره شده است را وارد کنند آن کاربر به عنوان یک کاربر معتبر شناخته می شود ، و به صفحه اصلی سایت فرستاده می شود.اگر کاربر UserID و رمز عبوری را وارد کند که با دیتابیس مطابقت نداشته باشد ، صفحه login ، پیغامی مانند "نام کاربری یا رمز عبور صحیح را وارد کنید" را نشان می دهد. تمام فرآیند بررسی آن که کاربر برای دسترسی به سایت معتبر می باشد یا نه احراز هویت(Authentication) نام دارد.

تعیین سطح دسترسی(Authorization):

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

پیش نیاز ها:

Visual Stadio 2015 -  

ایجاد برنامه تحت وب در Visual Stadio2015 :

در داخل ویژوال روی New کلیک کنید ، سپس Project ، سپس Web را انتخاب کنید و سپس ASP.NET Web Application را انتخاب کنید.نام پروژه خود را وارد کنید و سپس روی دکمه ی OK کلیک کنید.

MVC را انتخاب کنید و روی OK کلیک کنید.

ایجاد یک دیتابیس:

ابتدا ، ما یک دیتابیس ایجاد می کنیم و Connection String را در فایل Web.Config  برای DefaultConnection به همراه ارتباط  با دیتابیس جدیدی که ساخته ایم ، تنظیم میکنیم.ما از این دیتابیس برای  ایجاد جدول ASP.Net Identity و رسیدگی های مربوط به پروژه خود استفاده می کنیم .به جای استفاده از از دو دیتابیس که یکی مربوط به دیتابیس پیش فرض کاربر در ASP.NET می باشد و دیگری نیز برای دیتابیس Attendance DB می باشد، ما از یک دیتابیس متداول استفاده می کنیم که هم جزئیات کاربر را نگهداری می کند و هم اطلاعات مربوط به پروژه را در خودش دارد.

ایجاد دیتابیس:کد زیر را اجرا بگیرید و اسکریپت دیتابیس زیر را برای ایجاد دیتابیس نمونه ، ایجاد کنید.

-- Author      : barnamenevisan
•  -- Create date : 2016-01-17                               
•  -- Description : To Create Database                          
•                               
•  -- =============================================  
•  --Script to create DB,Table and sample Insert data  
•  USE MASTER;  
•  -- 1) Check for the Database Exists .If the database is exist then drop and create new DB  
•  IF EXISTS (SELECT [name] FROM sys.databases WHERE [name] = 'AttendanceDB' )  
•  BEGIN  
•  ALTER DATABASE AttendanceDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE  
•  DROP DATABASE AttendanceDB ;  
•  END  
•    
•    
•  CREATE DATABASE AttendanceDB  
•  GO  
•    
•  USE AttendanceDB  
•  GO  
Web.Config

در فایل web.config ما می توانیم    connection string به نام DefultConnection پیدا کنیم.به صورت پیش فرض ASP.NET MVC از این Connection String  برای ایجاد ارتباط بین جداول ASP.NET Identity مانند ASPNetUsers  و ... استفاده می کند. ما برای برنامه  خود همچنین نیاز داریم تا از دیتابیس برای کنترل عملکرد صفحات دیگر استفاده کنیم به جای این که از دو دیتابیس متفاوت استفاده کنیم، که یکی برای جزئیات کاربر و دیگری برای عملکردی که ما در نظر گرفته ایم می باشد.در اینجا ما از یک دیتابیس ، که همه ی جداول ASP.NET Identity  ایجاد خواهند شد و همچنین ما می توانیم جداول خودمان را برای صفحه ی کاربر ایجاد کنیم.

در این جا در Connection String نام SQL Server ، UID و PWD خود را برای ایجاد و ذخیره همه ی جزئیات کاربران در یک دیتابیس ،تغییر دهید .

1.	<connectionStrings>  
2.	    <add name="DefaultConnection" connectionString="data source=YOURSERVERNAME;initial catalog=AttendanceDB;user id=UID;password=PWD;Integrated Security=True" providerName="System.Data.SqlClient"  />   
3.	 </connectionStrings>  

ایجاد نقش پیش فرض و کاربر Admin :

ابتدا، نقش کاربر پیش فرض مانند" Admin"  ، "Manager"و .. را ایجاد کنید.و همچنین ما یک کاربرAdmin به صورت پیش فرض ایجاد می کنیم.ما همه ی نقش های پیش فرض و کاربر ها را در “Startup.cs”  ایجاد می کنیم.

OWIN(Open Web Interface for .Net)  یک اینترفیس استاندارد بین .NET و WEB Server را تعریف می کند و  هر برنامه OWIN یک StartUp Class دارد که در آن ما می توانیم component ها را مشخص کنیم.

در فایل “Startup.cs”  ما می توانیم متد Configuration را پیدا کنیم.از این متد ما متد()createRolesandUsers  را برای ایجاد یک  نقش کاربر و کاربر به صورت پیش فرض ، فراخوانی می کنیم.ما بررسی می کنیم که آیا نقش ها ایجاد شده است یا نه .اگر نقش هایی مانند Admin تشکیل نشده باشند ما یک نقش  جدید به عنوان Admin ایجاد می کنیم سپس یک کاربر پیش فرض ایجاد می کنیم ونقش آن را Admin قرار می دهیم.ما از این کاربر به عنوان کاربری که سطح دسترسی بالایی دارد که می تواند نقش های جدیدی را در برنامه MVC ما ایجاد می کند،  استفاده می کنیم .

1.	public void Configuration(IAppBuilder app)    
2.	{    
3.	    ConfigureAuth(app);    
4.	    createRolesandUsers();    
5.	}    
6.	  
7.	  
8.	// In this method we will create default User roles and Admin user for login    
9.	private void createRolesandUsers()    
10.	{    
11.	    ApplicationDbContext context = new ApplicationDbContext();    
12.	  
13.	    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));    
14.	    var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));    
15.	  
16.	  
17.	    // In Startup iam creating first Admin Role and creating a default Admin User     
18.	    if (!roleManager.RoleExists("Admin"))    
19.	    {    
20.	  
21.	        // first we create Admin rool    
22.	        var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();    
23.	        role.Name = "Admin";    
24.	        roleManager.Create(role);    
25.	  
26.	        //Here we create a Admin super user who will maintain the website                   
27.	  
28.	        var user = new ApplicationUser();    
29.	        user.UserName = barnamenevisan";    
30.	        user.Email = "barnamenevisan@gmail.com";    
31.	  
32.	        string userPWD = "A@z2016";    
33.	  
34.	        var chkUser = UserManager.Create(user, userPWD);    
35.	  
36.	        //Add default User to Role Admin    
37.	        if (chkUser.Succeeded)    
38.	        {    
39.	            var result1 = UserManager.AddToRole(user.Id, "Admin");    
40.	  
41.	        }    
42.	    }    
43.	  
44.	    // creating Creating Manager role     
45.	    if (!roleManager.RoleExists("مدیر"))    
46.	    {    
47.	        var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();    
48.	        role.Name = "مدیر";    
49.	        roleManager.Create(role);    
50.	  
51.	    }    
52.	  
53.	    // creating Creating Employee role     
54.	    if (!roleManager.RoleExists("کارمند"))    
55.	    {    
56.	        var role = new Microsoft.AspNet.Identity.EntityFramework.IdentityRole();    
57.	        role.Name = "کارمند";    
58.	        roleManager.Create(role);    
59.	  
60.	    }    
61.	}  

وقتی که برنامه را اجرا می گیریم ما میتوانیم جدول های مربوط به کاربر پیش فرض ASP.NET را ببینیم که در دیتابیس  AttendanceDB  ایجاد خواهند شد.در اینجا ما در عکس زیر می توانیم جداول مربوط به کابر پیش فرض ASP.NET که به صورت خودکار زمانی که برنامه را اجرا گرفته ایم ،ایجاد شده است را ببینیم. و همچنین تمام نقشهای پیش فرض کاربرکه در جدول ASPNetRoles قرار گرفته است وکاربر پیش فرض Admin   ایجاد شده را در جدول ASPNetUsers   ببینیم.

سفارشی سازی ثبت نام کاربر با اضافه کردن نام کاربری و نقش

به صورت پیش فرض برای ثبت نام در ASP.NET MVC5 ما می توانیم از ایمیل و رمز عبور استفاده کنیم.ما در اینجا ثبت نام را با اضافه کردن نام کاربری و یک ComboBox که نقش های کاربر را به ما نشان دهد سفارشی سازی می کنیم . کاربر می تواند نام کاربری را وارد کند و نقش کاربر را درهنگام ثبت نام انتخاب کند.

ابتدا ، یک TextBox را برای نام کاربری و یک ComboBox برای نمایش نقش کاربر در Register.cshtml اضافه می کنیم.

روی Register.cshtml  دوبار کلیک کنید و کد html  را  مانند زیر ویرایش کنید و یک textbox و combobox به همراه عنوان  ،اضافه کنید.  ابتدا ما یک TextBox و Combobox اضافه می کنیم.ما Combobox را با   ViewBag.Name  متصل میکنیم.

1.	@model shanuMVCUserRoles.Models.RegisterViewModel  
2.	@{  
3.	    ViewBag.Title = "ثبت نام";  
4.	}  
5.	  
6.	<h2>@ViewBag.Title.</h2>  
7.	  
8.	@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))  
9.	{  
10.	    @Html.AntiForgeryToken()  
11.	    <h4>ایجاد کاربر جدید.</h4>  
12.	    <hr />  
13.	    @Html.ValidationSummary("", new { @class = "text-danger" })  
14.	    <div class="form-group">  
15.	        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })  
16.	        <div class="col-md-10">  
17.	            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })  
18.	        </div>  
19.	    </div>  
20.	  
21.	  
22.	    <div class="form-group">  
23.	        @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })  
24.	        <div class="col-md-10">  
25.	            @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })  
26.	        </div>  
27.	    </div>  
28.	    <div class="form-group">  
29.	        @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })  
30.	        <div class="col-md-10">  
31.	            @Html.PasswordFor(m => m.Password, new { @class = "form-control" })  
32.	        </div>  
33.	    </div>  
34.	    <div class="form-group">  
35.	        @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })  
36.	        <div class="col-md-10">  
37.	            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })  
38.	        </div>  
39.	    </div>  
40.	  
41.	    <div class="form-group">  
42.	        @Html.Label("user Role", new { @class = "col-md-2 control-label" })  
43.	        <div class="col-md-10">  
44.	            @*@Html.DropDownList("Name")*@  
45.	            @Html.DropDownList("UserRoles", (SelectList)ViewBag.Name, " ")  
46.	        </div>  
47.	    </div>  
48.	  
49.	    <div class="form-group">  
50.	        <div class="col-md-offset-2 col-md-10">  
51.	            <input type="submit" class="btn btn-default" value="Register" />  
52.	        </div>  
53.	    </div>  
54.	}  
55.	  
56.	@section Scripts {  
57.	    @Scripts.Render("~/bundles/jqueryval")  
58.	}  

قسمت Model :

سپس در AccountViewModel.cs  ، RegisterViewModel را بررسی کنید و property های UserRoles  و UserName به همراه صفت های مورد نیاز برای اعتبارسنجی را اضافه کنید.

روی فایل  AccountViewModel.cs   ، در پوشه ی Models دوبار کلیک کنید ، کلاس RegisterViewModel را پیدا کنید و Propertyهای UserName و UserRoles را مانند زیر اضافه کنید.

1.	public class RegisterViewModel    
2.	{    
3.	    [Required]    
4.	    [Display(Name = "UserRoles")]    
5.	    public string UserRoles { get; set; }    
6.	  
7.	    [Required]    
8.	    [EmailAddress]    
9.	    [Display(Name = "Email")]    
10.	    public string Email { get; set; }    
11.	  
12.	    [Required]    
13.	    [Display(Name = "UserName")]    
14.	    public string UserName { get; set; }    
15.	  
16.	    [Required]    
17.	    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]    
18.	    [DataType(DataType.Password)]    
19.	    [Display(Name = "Password")]    
20.	    public string Password { get; set; }    
21.	  
22.	    [DataType(DataType.Password)]    
23.	    [Display(Name = "Confirm password")]    
24.	    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]    
25.	    public string ConfirmPassword { get; set; }    
26.	}  

قسمت Controller:

در AccountController.cs  ابتدا ما تمامی اسامی نقش ها را به جز نقش Admin در ComboBox می گیریم و در دکمه ی  ثبت نام  ، ما قابلیت وارد کردن نام کاربری و قرار دادن نقشی که کاربر انتخاب کرده در دیتابیس ASP.NET identity را اضافه کرده ایم.

ابتدا یک Object از ApplicationDBContext ، ایجاد کنید.در اینجا ApplicationDBContext یک کلاسی است که برای اجرای همه ی توابع دیتابیس ASP.NET  Identity مانند ایجاد کاربر، نقش ها و... استفاده می شود.

ApplicationDbContext context;  
        public AccountController()  
        {  
            context = new ApplicationDbContext(); 

       }  

متد Register ActionResult :

استفاده ازobject   ApplicationDBConterxt  تمام نقش ها را از دیتابیس می گیریم.برای کاربری که ثبت نام می کند،نقش Admin را نمایش نمی دهیم.کاربر می تواند بقیه ی نقش ها را در هنگام ثبت نام انتخاب کند.

// GET: /Account/Register    
[AllowAnonymous]    
public ActionResult Register()    
{    
    ViewBag.Name = new SelectList(context.Roles.Where(u => !u.Name.Contains("Admin"))    
                                   .ToList(), "Name", "Name");    
    return View();    
}    

ثبت نام کاربر

به صورت پیش فرض ایمیل کاربر به عنوان نام کاربری در جدول ASPNetUsers ذخیره می شود.در اینجا به جای ایمیل کاربر، نامی که کاربر وارد کرده است را ذخیره می کنیم.بعد از این که کاربر با موفقیت ایجاد شد ، ما نقشی که کاربر انتخاب کرده است را برایش تنظیم می کنیم.

// POST: /Account/Register    
02.[HttpPost]    
03.[AllowAnonymous]    
04.[ValidateAntiForgeryToken]    
05.public async Task<ActionResult> Register(RegisterViewModel model)    
06.{    
07.    if (ModelState.IsValid)    
08.    {    
09.        var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };    
10.        var result = await UserManager.CreateAsync(user, model.Password);    
11.        if (result.Succeeded)    
12.        {    
13.            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);    
14.  
15.            // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771    
16.            // Send an email with this link    
17.            // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);    
18.            // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);    
19.            // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");    
20.            //Assign Role to user Here       
21.            await this.UserManager.AddToRoleAsync(user.Id, model.UserRoles);    
22.            //Ends Here     
23.            return RedirectToAction("Index", "Users");    
24.        }    
25.        ViewBag.Name = new SelectList(context.Roles.Where(u => !u.Name.Contains("Admin"))    
26.                                  .ToList(), "Name", "Name");    
27.        AddErrors(result);    
28.    }    
29.  
30.    // If we got this far, something failed, redisplay form    
31.    return View(model);    
32.}   

سفارشی سازی ورود به سایت کاربر:

همانطوری که ثبت نام کاربر را سفارشی سازی کردیم قسمت ورود به سایت هم سفارشی سازی می کنیم.به این ترتیب که کاربر هنگام ورود به سایت به جای وارد کردن ایمیل ، نام کاربری خود را وارد کند.به صورت پیش فرض در ASP.NET MVC5 برای ورود به سایت، کاربر باید ایمیل و رمز عبور خود را وارد کند.در اینجا ورود به سایت را با نام کاربری و رمز عبور کاربر سفارشی سازی می کنیم.بنابراین ما از نام کاربری به جای ایمیل استفاده می کنیم.

قسمت View:

در اینجا ایمیل را با نام کاربری در Login.cshtml تغییر دادیم و می توانیم فایل  Login.cshtml را از پوشه داخل  Views/Account/Login.cshtml, پیدا کنیم.

@using shanuMVCUserRoles.Models  
02.@model LoginViewModel  
03.@{  
04.    ViewBag.Title = "ورود به سایت";  
05.}  
06.  
07.<h2>@ViewBag.Title</h2>  
08.<div class="row">  
09.    <div class="col-md-8">  
10.        <section id="loginForm">  
11.            @using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))  
12.            {  
13.                @Html.AntiForgeryToken()  
14.                <h4>Use a local account to log in.</h4>  
15.                <hr />  
16.                @Html.ValidationSummary(true, "", new { @class = "text-danger" })  
17.                <div class="form-group">  
18.                    @Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })  
19.                    <div class="col-md-10">  
20.                        @Html.TextBoxFor(m => m.UserName, new { @class = "form-control" })  
21.                        @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })  
22.                    </div>  
23.                </div>  
24.                <div class="form-group">  
25.                    @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })  
26.                    <div class="col-md-10">  
27.                        @Html.PasswordFor(m => m.Password, new { @class = "form-control" })  
28.                        @Html.ValidationMessageFor(m => m.Password, "", new { @class = "text-danger" })  
29.                    </div>  
30.                </div>  
31.                <div class="form-group">  
32.                    <div class="col-md-offset-2 col-md-10">  
33.                        <div class="checkbox">  
34.                            @Html.CheckBoxFor(m => m.RememberMe)  
35.                            @Html.LabelFor(m => m.RememberMe)  
36.                        </div>  
37.                    </div>  
38.                </div>  
39.                <div class="form-group">  
40.                    <div class="col-md-offset-2 col-md-10">  
41.                        <input type="submit" value="ورود" class="btn btn-default" />  
42.                    </div>  
43.                </div>  
44.                <p>  
45.                    @Html.ActionLink("ثبت نام کاربر جدید", "Register")  
46.                </p>  
47.                @* Enable this once you have account confirmation enabled for password reset functionality  
48.                    <p>  
49.                        @Html.ActionLink("Forgot your password?", "ForgotPassword")  
50.                    </p>*@  
51.}  
52.        </section>  
53.    </div>  
54.    <div class="col-md-4">  
55.        <section id="socialLoginForm">  
56.            @Html.Partial("_ExternalLoginsListPartial", new ExternalLoginListViewModel { ReturnUrl = ViewBag.ReturnUrl })  
57.        </section>  
58.    </div>  
59.</div>  
60.  
61.@section Scripts {  
62.    @Scripts.Render("~/bundles/jqueryval")  
63.}  

قسمت Model:

مانند ثبت نام در قسمت AccountViewModel  باید  loginViewModel را برای تغییر ایمیل به نام کاربری ، پیدا کنیم.

در اینجا در کد زیر می توانیم ببینیم که property ایمیل را به نام کاربری تغییر دادیم.

public class LoginViewModel    
02.{    
03.    [Required]    
04.    [Display(Name = "نام کاربری")]    
05.  
06.    public string UserName { get; set; }    
07.  
08.    [Required]    
09.    [DataType(DataType.Password)]    
10.    [Display(Name = "رمز عبور")]    
11.    public string Password { get; set; }    
12.  
13.    [Display(Name = "مرا به خاطر بسپار")]    
14.    public bool RememberMe { get; set; }    
15.}    

قسمت Controller :

در دکمه ی login ، باید ایمیل را با نام کاربری تغییر بدهیم تا ، برای احراز هویت کاربر از دیتابیس بررسی شود. در کد زیر می توانیم ببینیم وقتی که ایمیل را با نام کاربری تغییر دادیم بعد ازاینکه موفق شدیم تا وارد سایت شویم ، ما به صفحه ی کاربر فرستاده می شویم.بعدا خواهیم دید که چگونه یک صفحه کاربر ایجاد کنیم و متن و منوی صفحه را براساس نقش کاربر نمایش دهیم.

// POST: /Account/Login    
02.[HttpPost]    
03.[AllowAnonymous]    
04.[ValidateAntiForgeryToken]    
05.public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)    
06.{    
07.    if (!ModelState.IsValid)    
08.    {    
09.        return View(model);    
10.    }    
11.  
12.    // This doesn't count login failures towards account lockout    
13.    // To enable password failures to trigger account lockout, change to shouldLockout: true    
14.    var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);    
15.    switch (result)    
16.    {    
17.        case SignInStatus.Success:    
18.            return RedirectToLocal(returnUrl);    
19.        case SignInStatus.LockedOut:    
20.            return View("Lockout");    
21.        case SignInStatus.RequiresVerification:    
22.            return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });    
23.        case SignInStatus.Failure:    
24.        default:    
25.            ModelState.AddModelError("", "Invalid login attempt.");    
26.            return View(model);    
27.    }    
28.}    
29.  
30.//    
31.// GET: /Account/VerifyCode    
32.[AllowAnonymous]    
33.public async Task<ActionResult> VerifyCode(string provider, string returnUrl, bool rememberMe)    
34.{    
35.    // Require that the user has already logged in via username/password or external login    
36.    if (!await SignInManager.HasBeenVerifiedAsync())    
37.    {    
38.        return View("Error");    
39.    }    
40.    return View(new VerifyCodeViewModel { Provider = provider, ReturnUrl = returnUrl, RememberMe = rememberMe });    
41.}    

احراز هویت و تعیین سطح دسترسی کاربر:

در اینجا یک صفحه جدید برای نمایش پیغام مربوط به احرازهویت و سطح دسترسی کاربر براساس نقش کاربر ایجاد می کنیم

اگر کاربر وارد شده Admin باشد، یک پیغام خوش آمد گویی به Admin و همچنین یک منو برای ایجاد نقش های جدید ، نمایش میدهیم.

اگر کاربر وارد شده نقش مدیر، کارمند ، حسابدار و... را داشت یک پیغام خوش آمد گویی ، به آن ها نشان دهد.

ابتدا ، یک Controller خالی با نام “userscontroller.cs ایجاد کنید.در این Controller ابتدا [Authorize] را به بالای Controller برای بررسی معتبر بودن کاربر ، قرار می دهیم.

ایجاد View : روی index ActionResult راست کلیک کنید و یک view ایجاد کنید.

در View مقدار ViewBag.displayMenu بررسی می شود.اگر مقدار آن "Yes" بود ما پیغام خوش آمد گویی Admin و یک لینک برای ایجاد منوی  جدید ، را نمایش می دهیم .اگرمقدار  ViewBag.displayMenu مقدار “No” باشد، نام کاربر و پیغام خوش آمدگویی را نشان بدهد.

@{  
02.    ViewBag.Title = "Index";  
03.}  
07.@if (ViewBag.displayMenu == "Yes")  
08.{  
09.    <h1>کاربر مدیر خوش آمدید، اکنون شما می توانید نقش های دلخواه خود را ایجاد کنید</h1>  
10.    <h3>  
11.        <li>@Html.ActionLink("مدیریت نقش ها", "Index", "Role")</li>  
12.    </h3>  
13.}  
14.else  
15.{  
16.    <h2>  خوش آمدید <strong>@ViewBag.Name</strong> :) ما ماژول کاربر را به زودی اضافه خواهیم کرد</h2>  
17.}  

قسمت Controller:

در Controller بررسی می کنیم که کاربر وارد سیستم شده است یا نه .اگر کاربر وارد نشده باشد پیغام "شما وارد سیستم نشده اید"را نشان میدهیم.و اگر کاربر احراز هویت شده باشد،سپس نقش کاربر وارد شده را بررسی می کنیم.اگر نقش کاربر Admin باشد ، ما ViewBag.displayMenu =Yes , تنظیم میکنیم در غیر اینصورت ViewBag.displayMenu = "No” تنظیم می کنیم.

public ActionResult Index()    
02.{    
03.    if (User.Identity.IsAuthenticated)    
04.    {    
05.        var user = User.Identity;    
06.        ViewBag.Name = user.Name;    
07.        
08.        ViewBag.displayMenu = "No";    
09.  
10.        if (isAdminUser())    
11.        {    
12.            ViewBag.displayMenu = "Yes";    
13.        }    
14.        return View();    
15.    }    
16.    else    
17.    {    
18.        ViewBag.Name = "شما وارد سیستم نشده اید";    
19.    }    
20.    return View();    
21.  
22.}    

برای بررسی این که کابر وارد سایت شده است یا نه ما یک متد ایجاد می کنیم که مقدار  Boolean  را برای متد اصلی Index ما برمی گرداند .

public Boolean isAdminUser()    
02.{    
03.    if (User.Identity.IsAuthenticated)    
04.    {    
05.        var user = User.Identity;    
06.        ApplicationDbContext context = new ApplicationDbContext();    
07.        var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));    
08.        var s = UserManager.GetRoles(user.GetUserId());    
09.        if (s[0].ToString() == "Admin")    
10.        {    
11.            return true;    
12.        }    
13.        else    
14.        {    
15.            return false;    
16.        }    
17.    }    
18.    return false;    
19.}    

کاربرهای Admin می توانند نقش ها را ایجاد کنند

در حال حاضر دیدیم که اگر کاربر وارد شده نقش Admin را داشته باشد یک لینک برای ایجاد کاربرهای جدید ، نمایش می دهد.برای ورود Admin یک کاربر پیش فرض با نام کاربری "barnamenevisan"و رمز عبور “A@z2016” ایجاد کرده ایم.

برای  ایجاد نقش کاربر توسط admin ابتدا یک Controller خالی جدید اضافه می کنیم.و نام آن را RoleController.cs می گذاریم.در این controller بررسی می کنیم که آیا نقش کاربر Admin هست یا خیر.اگر کاربر وارد شده Admin باشد ، همه ی اسامی نقش ها را با استفاده از ApplicationDbContext object را میگیرد.

public ActionResult Index()    
02.{    
03.  
04.    if (User.Identity.IsAuthenticated)    
05.    {    
06.  
07.  
08.        if (!isAdminUser())    
09.        {    
10.            return RedirectToAction("Index", "Home");    
11.        }    
12.    }    
13.    else    
14.    {    
15.        return RedirectToAction("Index", "Home");    
16.    }    
17.  
18.    var Roles = context.Roles.ToList();    
19.    return View(Roles);    
20.  
21.}     

در View ما همه ی نقش های کاربر را در جدول HTML ، وصل می کنیم.

@model IEnumerable<Microsoft.AspNet.Identity.EntityFramework.IdentityRole>  
02.@{  
03.    ViewBag.Title = "اضافه کردن نقش";  
04.}  
05.<table style=" background-color:#FFFFFF; border: dashed 3px #6D7B8D; padding: 5px;width: 99%;table-layout:fixed;" cellpadding="6" cellspacing="6">  
06.    <tr style="height: 30px; background-color:#336699 ; color:#FFFFFF ;border: solid 1px #659EC7;">  
07.        <td align="center" colspan="2">  
08.            <h2> ایجاد نقش کاربر</h2>  
09.        </td>  
10.  
11.    </tr>  
12.  
13.    <tr>  
14.        <td>  
15.            <table id="tbrole" style="width:100%; border:dotted 1px; background-color:gainsboro; padding-left:10px;">  
16.  
17.                @foreach (var item in Model)  
18.                {  
19.                    <tr>  
20.                        <td style="width:100%; border:dotted 1px;">  
21.                            @item.Name  
22.                        </td>  
23.                    </tr>}  
24.            </table>  
25.        </td>  
26.        <td align="right" style="color:#FFFFFF;padding-right:10;">  
27.  
28.  
29.            <h3>   @Html.ActionLink("برای ایجاد نقش های جدید اینجا را کلیک کنید", "Create", "Role") </h3>  
30.        </td>  
31.    </tr>  
32.</table>  

نتیجه گیری:

ابتدا یک دیتابیس AttendanceDB  در SQL Server ایجاد کنید. فایل Web.Config ، را با توجه به نحوه ی تنظیماتی که در بالا ذکر شد ، دیتابیس خود تنظیم کنید.در فایل Startup.cs ما یک کاربر ادمین به صورت پیش فرض با نام کاربری Barnamenevisan و رمز عبور A@z2016 ایجاد کردیم.این نام کاربری و رمز عبور ، برای ورود به سایت ادمین می باشد.شما می توانید این نام کاربری و رمز عبور را به دلخواه خودتان تغییر بدهید.بدلیل امنیتی شما می توانید وقتی با نام کاربری و رمز عبور  ادمین وارد سایت شدید ، نام کاربری و رمز عبور را تغییر بدهید.

آموزش asp.net mvc

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

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

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

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

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