재우니의 블로그

 

 

이 기사에서는 ASP.NET MVC 6 애플리케이션에서 User Authentication 을 구현할 것입니다. MVC 5와 마찬가지로 MVC 6에 Authentication Action Filter 가 있습니다.다음 다이어그램은 최종 사용자가 MVC 6 응용 프로그램을 호출 할 때 인증에 대한 아이디어를 제공합니다.

aspnet-mvc-user-auth

최종 사용자가 View를 요청하는 MVC 6 응용 프로그램을 호출하면 해당 action 이 실행될 때 View 형식의 응답이 반환됩니다. 그러나 Controller 또는 Action이 Authorize 속성 과 함께 적용 되면, 서버의 요청 처리는 로그인 페이지 응답을 클라이언트에 보냅니다. 최종 사용자가 자격 증명을 사용하여 요청을 보내면 응용 프로그램 사용자가 저장된 데이터베이스 서버에 대해 자격 증명의 유효성을 확인하는 Authentication Filter 가 실행됩니다. 자격 증명의 유효성을 검사하면 사용자가 로그인 되고, View 의 응답이 다시 사용자에게 전송됩니다.

 

 

ASP.NET MVC에서 인증 구현하기

 

 

이 응용 프로그램을 구현하기 위해 Visual Studio 2015 Community Edition   과 ASP.NET 5 RC1을 사용합니다. ASP.NET 5 RC 1 링크 에서 다운로드 할 수 있습니다 .

 

 

1 단계 :

 Visual Studio 2015를 열고 다음 이미지와 같이 이름이 ASPNET5_Auth 인 새 ASP.NET 응용 프로그램을 만듭니다

create-aspnet-project

확인

 을 클릭 하고 다음 창에서 다음 그림과 같이 ASP.NET 5 템플릿에서 ASP.NET 빈 응용 프로그램을 선택합니다.

aspnet-empty-app

2 단계 :

 여기에 표시된대로 MVC, Identity, EntityFramework 등을 사용하기 위해 다음 종속성을 추가해야합니다.

"dependencies": {
    "EntityFramework.Commands": "7.0.0-rc1-final",
    "EntityFramework.MicrosoftSqlServer": "7.0.0-rc1-final",
    "Microsoft.AspNet.Identity": "3.0.0-rc1-final",
    "Microsoft.AspNet.Identity.EntityFramework": "3.0.0-rc1-final",
    "Microsoft.AspNet.IISPlatformHandler": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc": "6.0.0-rc1-final",
    "Microsoft.AspNet.Server.Kestrel": "1.0.0-rc1-final",
    "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-beta4",
    "Microsoft.AspNet.Authentication.Cookies": "1.0.0-rc1-final",
    "Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-rc1-final",
    "Microsoft.AspNet.StaticFiles": "1.0.0-rc1-final",
    "Microsoft.Extensions.CodeGenerators.Mvc": "1.0.0-rc1-final",
    "Microsoft.AspNet.Tooling.Razor": "1.0.0-rc1-final"
  },
 
  "commands": {
    "web": "Microsoft.AspNet.Server.Kestrel",
    "ef": "EntityFramework.Commands"
  }


위의 종속성은 프로젝트에 필요한 어셈블리를 추가합니다.

3 단계 :

 응용 프로그램 사용자 정보를 SQL Server 데이터베이스에 저장해야하기 때문에 SQL Server를 열고 Security 이라는 데이터베이스를 만듭니다 

.

4 단계 :

 프로젝트에서 새 ASP.NET 구성 파일을 추가하면 프로젝트에 appSettings.json 파일이 추가됩니다. 이 파일에 다음 연결 문자열을 추가하십시오.

{
    "Data": {
        "DefaultConnection": {
            "ConnectionString": "Server=.;Database=Security;
                                    Trusted_Connection=True;"
        }
    }
}

5 단계 :

 프로젝트에서 모델, 뷰 및 컨트롤러 폴더를 추가합니다. Models 폴더에 다음 클래스 파일을 추가하십시오.

Register.cs

using System.ComponentModel.DataAnnotations;
 
namespace ASPNET5_Auth.Models
{
    public class Register
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }
 
        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }
 
        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }
    }
}

위의 클래스는 새 사용자를 등록하기위한 속성을 포함합니다.

Login.cs

using System.ComponentModel.DataAnnotations;
 
namespace ASPNET5_Auth.Models
{
    public class Login
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }
 
        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }
}

위의 클래스에는 사용자 로그인에 대한 속성이 포함되어 있습니다.

ApplicationUser.cs

using Microsoft.AspNet.Identity.EntityFramework;
 
namespace ASPNET5_Auth.Models
{
    public class ApplicationUser :IdentityUser
    {
    }
}

위 클래스는 

IdentityUser입니다. 

이것은 응용 프로그램 사용자를 관리하는 데 사용됩니다. 이 클래스는 고유 전자 메일을 기반으로 응용 프로그램 사용자 이름을 저장하는 데 사용됩니다.

AppDbContext.cs

using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Data.Entity;
 
namespace ASPNET5_Auth.Models
{
    public class AppDbContext : IdentityDbContext<ApplicationUser>
    {
        protected override void OnModelCreating(ModelBuilder builder)
        {
            base.OnModelCreating(builder);
        }
    }
}

위 클래스는 Connection 문자열을 사용하여 데이터베이스 서버에 연결하고 응용 프로그램 사용자 정보를 저장하기위한 테이블을 생성합니다. 

IdentityDbContext <T>

 클래스는 데이터베이스 서버에 연결 EntityFramework를 사용합니다.

ModelClasses.cs

using System.Collections.Generic;
 
namespace ASPNET5_Auth.Models
{
    public class Person
    {
        public int PersonId { get; set; }
        public string PersonName { get; set; }
    }
 
    public class PersonDatabase : List<Person>
    {
        public PersonDatabase()
        {
            Add(new Person() { PersonId=1,PersonName="MS"});
            Add(new Person() { PersonId = 2, PersonName = "SA" });
            Add(new Person() { PersonId = 3, PersonName = "VP" });
        }
    }
}

위의 코드는 Person 데이터를 저장하기위한 Person 개체 클래스와 PersonDatabase 클래스를 정의하는 데 사용됩니다.

6 단계 :

 응용 프로그램 사용자를 저장하기위한 테이블을 생성하려면 프로젝트 이름을 마우스 오른쪽 단추로 클릭 

하고, 파일 탐색기에서 폴더 열기

 옵션을 선택합니다. 그러면 탐색기 창이 열립니다. ctrl + shift > 를 사용하여 탐색기 창의 모든 폴더를 마우스 오른쪽 버튼으로 클릭하고 

여기에서 명령 창 열기

 옵션을 선택 합니다. 명령 프롬프트가 열립니다. 명령 프롬프트에서 다음 명령을 실행하십시오.

dnu restore
dnvm use 1.0.0-rc1-final -p
dnx ef migrations add Initial
dnx ef database update

이 명령에 대한 자세한 내용은 

이 링크

 에서 읽을 수 있습니다 .이렇게하면 Sql Server 

Security

 데이터베이스 에 다음 표가 추가 됩니다.

데이터베이스 스키마

이 명령은 AppDbContextModelSnapshot 클래스가 포함 된 프로젝트의 

Migration

 폴더 도 추가합니다 여기에는 DB 마이그레이션을위한 논리가 포함됩니다. Initial 클래스에는 Migration Command를 사용하여 테이블 만들기에 대한 논리가 포함되어 있습니다.

7 단계 :

 Controllers 폴더에 

AccountController

 라는 이름의 MVC Controller 클래스 유형의 새 항목을 추가합니다 이 클래스에서 다음 코드를 추가하십시오.

using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
using Microsoft.AspNet.Authorization;
using ASPNET5_Auth.Models;
using Microsoft.AspNet.Identity;
 
  
 
namespace ASPNET5_Auth.Controllers
{
 
    public class AccountController : Controller
    {
        //1
        private readonly UserManager<ApplicationUser> _securityManager;
        private readonly SignInManager<ApplicationUser> _loginManager;
        //2
        public AccountController(UserManager<ApplicationUser> secMgr, SignInManager<ApplicationUser> loginManager)
        {
            _securityManager = secMgr;
            _loginManager = loginManager;
        }
 
        //3
        [HttpGet]
        [AllowAnonymous]
        public IActionResult Register()
        {
            return View();
        }
 
        //4
  
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(Register model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser
                {
                    UserName = model.Email,
                    Email = model.Email
                };
                var result = await _securityManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await _loginManager.SignInAsync(user, isPersistent: false);
                    return RedirectToAction(nameof(HomeController.Index), "Home");
                }
            }
             
            return View(model);
        }
 
        //5
        [HttpGet]
        [AllowAnonymous]
        public IActionResult Login(string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            return View();
        }
 
        //6
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(Login model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            if (ModelState.IsValid)
            {
                var result = await _loginManager.PasswordSignInAsync(model.Email, model.Password, false, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    return RedirectToReturnUrl(returnUrl);
                }
            }
 
              
            return View(model);
        }
 
        //7
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> LogOff()
        {
            await _loginManager.SignOutAsync();
             
            return RedirectToAction(nameof(HomeController.Index), "Home");
        }
        //8
        private IActionResult RedirectToReturnUrl(string returnUrl)
        {
            if (Url.IsLocalUrl(returnUrl))
            {
                return Redirect(returnUrl);
            }
            else
            {
                return RedirectToAction(nameof(HomeController.Index), "Home");
            }
        }
    }
}

위의 코드는 다음과 같은 사양을 가지고 있습니다.1. 

UserManager <T>

 및 

SignInManager <T>

 클래스의 객체를 선언합니다 UserManager <T>는 영구 저장소 (예 : 데이터베이스)에서 사용자를 관리하는 데 사용되고 SignInManager <T> 클래스는 사용자 로그인에 대한 API를 관리하는 데 사용됩니다. 여기서 

T

 는 사용자 정보가 포함 된 ApplicationUser 클래스입니다.2. Controller 클래스의 생성자에는 UserManager 및 SignInManager 종속성이 삽입됩니다. 이러한 종속성은 이후 단계에서 등록됩니다.3. 

등록

 보기 로 응답하는 단계 .4. HttpPost 

등록

 받아들이는 방법 

등록

 모델 객체를. 이 메서드는 SignInManager 클래스의 

CreateAsync ()

 메서드를 사용하여 응용 프로그램 메서드를 만듭니다 사용자가 성공적으로 등록되면 사용자는 UserManager 클래스의 

SignAsync ()

 메소드를 사용하여 서명됩니다 .5. Login View로 응답하는 HttpGet 

Login ()

 메소드.6. 

Login ()

 HttpPost 메소드는 이메일과 비밀번호가 포함 된 모델에 사용됩니다. 로그인이 성공하면 로그인 요청이 시작된 페이지로 리디렉션됩니다.7. LogOff () 메소드.8. 로그인 요청이 시작된 URL로 리디렉션하는 개인용 메소드.

 

8 단계 :

 Controllers 폴더에 다음 새 컨트롤러를 추가합니다.

PersonController.cs

using Microsoft.AspNet.Mvc;
 
using ASPNET5_Auth.Models;
using Microsoft.AspNet.Authorization;
 
namespace ASPNET5_Auth.Controllers
{
    [Authorize]
    public class PersonController : Controller
    {
        // GET: /<controller>/
        public IActionResult Index()
        {
            var persons = new PersonDatabase();
            return View(persons);
        }
    }
}

위의 컨트롤러에는 Person 컬렉션을 반환하는 Index 메서드가 들어 있습니다.

HomeController.cs

using Microsoft.AspNet.Mvc;
 
namespace ASPNET5_Auth.Controllers
{
    public class HomeController : Controller
    {
        // GET: /<controller>/
        public IActionResult Index()
        {
            return View();
        }
    }
}

Home Controller에는 Index 메소드가 있습니다.

9 단계 :

 프로젝트에서보기를 위해 부트 스트랩 스타일을 사용해야하므로 프로젝트에서 Bower.json을 추가하고 다음 종속성을 추가합니다

"dependencies": {
    "jQuery": "2.1.4",
    "bootstrap": "3.3.6"
  }

그러면 jQuery와 Bower 종속성 이 프로젝트 의 

wwwroot

 섹션에 설치됩니다 .

10 단계 :

 보기 폴더에서 

공유

 폴더 추가를 클릭 합니다. 이 폴더에서 새 항목 추가를 사용하여 

MVC보기 레이아웃 페이지를

 추가합니다 이것은 _Layout.cshtml 페이지입니다. 다음 마크 업과 스크립트 참조를 여기에 추가하십시오.

<!DOCTYPE html>
 
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <link rel="stylesheet"  href="~/lib/bootstrap/dist/css/bootstrap.min.css" />
    <title>@ViewBag.Title</title>
</head>
<body>
    <div class="navbar-collapse collapse"><ul class="nav navbar-nav">             <li><a rel="nofollow" target="_blank">Home</a></li>             <li><a rel="nofollow" target="_blank">Person</a></li>             <li><a rel="nofollow" target="_blank">Register</a></li>             <li><a rel="nofollow" target="_blank">Login</a></li>         </ul></div>
    <div>@RenderBody()</div>
    <a href="http://~/lib/jQuery/dist/jquery.js" rel="nofollow" target="_blank">http://~/lib/jQuery/dist/jquery.js</a>
    <a href="http://~/lib/bootstrap/dist/js/bootstrap.js" rel="nofollow" target="_blank">http://~/lib/bootstrap/dist/js/bootstrap.js</a>
</body>
</html