이 기사에서는 ASP.NET MVC 6 애플리케이션에서 User Authentication 을 구현할 것입니다. MVC 5와 마찬가지로 MVC 6에 Authentication Action Filter 가 있습니다.다음 다이어그램은 최종 사용자가 MVC 6 응용 프로그램을 호출 할 때 인증에 대한 아이디어를 제공합니다.
최종 사용자가 View를 요청하는 MVC 6 응용 프로그램을 호출하면 해당 action 이 실행될 때 View 형식의 응답이 반환됩니다. 그러나 Controller 또는 Action이 Authorize 속성 과 함께 적용 되면, 서버의 요청 처리는 로그인 페이지 응답을 클라이언트에 보냅니다. 최종 사용자가 자격 증명을 사용하여 요청을 보내면 응용 프로그램 사용자가 저장된 데이터베이스 서버에 대해 자격 증명의 유효성을 확인하는 Authentication Filter 가 실행됩니다. 자격 증명의 유효성을 검사하면 사용자가 로그인 되고, View 의 응답이 다시 사용자에게 전송됩니다.
이 응용 프로그램을 구현하기 위해 Visual Studio 2015 Community Edition 과 ASP.NET 5 RC1을 사용합니다. ASP.NET 5 RC 1 링크 에서 다운로드 할 수 있습니다 .
1 단계 :
Visual Studio 2015를 열고 다음 이미지와 같이 이름이 ASPNET5_Auth 인 새 ASP.NET 응용 프로그램을 만듭니다
확인
을 클릭 하고 다음 창에서 다음 그림과 같이 ASP.NET 5 템플릿에서 ASP.NET 빈 응용 프로그램을 선택합니다.
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
|