버전 정보

.NET Framework 4.7

Mvc 5.2.3.0

입니다.



이전에 비슷한 글을 작성한적이 있다.

개별 사용자 계정 인증을 사용하고 그로인해 생성된 테이블에 추가 정보를 담을 수 있는 컬럼을 만들어 정보를 그 컬럼에 담는 방법이었다.

이번 방법은 사용자 정보를 담는 컬럼이 아니라 테이블 자체를 만들어서 Id 값으로 연결하여 사용하는 방법이 되겠다.


버전이 올라감에 따라 사용자 정보를 담는 테이블명이 바뀌었던것 같고 그래서 차후 버전업을 해야 될 필요성이 생기고하면 지금의 형태가 좀 더 수월하게 진행할 수 있지않을까해서 사용하는 방법이다.


일단 이쯤에서 이전글도 한번 링크 걸겠다.

2014/07/23 - [Asp.Net Mvc] - Mvc5 개별사용자 인증에 추가 정보란 만들기

 

1. 새 프로젝트 생성


1) 새 프로젝트를 생성합니다. Visual C# - 웹 - ASP.NET 웹 응용 프로그램(.NET Framework)를 선택하시고 프레임워크 버전을 4.7로 맞춰 줍니다.


2) MVC를 선택하고 인증 변경 버튼을 눌러줍니다.


3) 인증을 개별 사용자 계정으로 변경하고 확인.


4) 프로젝트 생성



2. 모델(Model) 수정


1) IdentityModels.cs 를 아래처럼 수정합니다. 사용자 닉네임과 등록 시간을 추가로 저장하겠습니다. 녹색 글씨가 추가된 부분입니다.

/Models/IdentityModels.cs



using System;

using System.ComponentModel.DataAnnotations;

using System.Security.Claims;

using System.Threading.Tasks;

using Microsoft.AspNet.Identity;

using Microsoft.AspNet.Identity.EntityFramework;




namespace TestMvc01.Models

{

public class ApplicationUser : IdentityUser

{

public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)

{

var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);


return userIdentity;

}

}


public class UsersInfoes

{

[Key]

public string Id { get; set; }


[StringLength(20)]

public string UserNick { get; set; }


public DateTime DateC { get; set; }

}


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>

{

public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false)

{

}


public System.Data.Entity.DbSet<UsersInfoes> UInfoes { get; set; }


public static ApplicationDbContext Create()

{

return new ApplicationDbContext();

}

}

}

 



2) AccountViewModels.cs 를 아래와같이 수정합니다. 닉네임 관련된 부분만 정보를 받도록 하고 등록 시간은 백엔드에서 처리하겠습니다. 추가된 부분은 녹색글씨입니다.

/Models/IdentityModels.cs



public class RegisterViewModel

{

[Required]

[EmailAddress]

[Display(Name = "전자 메일")]

public string Email { get; set; }


[Required]

[StringLength(100, ErrorMessage = "{0}은(는) {2}자 이상이어야 합니다.", MinimumLength = 6)]

[DataType(DataType.Password)]

[Display(Name = "암호")]

public string Password { get; set; }


[DataType(DataType.Password)]

[Display(Name = "암호 확인")]

[Compare("Password", ErrorMessage = "암호와 확인 암호가 일치하지 않습니다.")]

public string ConfirmPassword { get; set; }


[Required]

[StringLength(20, ErrorMessage = "{0}은(는) {2}자 이상이어야 합니다.", MinimumLength = 2)]

[Display(Name = "닉네임")]

public string UserNick { get; set; }

}



3. 뷰(View) 수정


1) Register.cshtml 을 아래와같이 수정하자. 등록 부분에 사용자 닉네임을 추가로 받도록 수정하였습니다. 추가된 구문은 녹색입니다.

/Views/Register.cshtml



@model TestMvc01.Models.RegisterViewModel

@{

ViewBag.Title = "등록";

}


<h2>@ViewBag.Title.</h2>


@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))

{

@Html.AntiForgeryToken()

<h4>새 계정을 만드십시오.</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>

<div class="form-group">

@Html.LabelFor(m => m.UserNick, new { @class = "col-md-2 control-label" })

<div class="col-md-10">

@Html.TextBoxFor(m => m.UserNick, new { @class = "form-control" })

</div>

</div>

<div class="form-group">

<div class="col-md-offset-2 col-md-10">

<input type="submit" class="btn btn-default" value="등록" />

</div>

</div>

}


@section Scripts {

@Scripts.Render("~/bundles/jqueryval")

}



4. 컨트롤러(Controller) 수정


1) AccountController.cs 를 아래와같이 수정하자. 등록 부분을 수정하였습니다. 닉네임은 받아온걸로 처리하고 등록 시간은 현재 시간으로 처리합니다. 녹색이 추가된 부분입니다.

/Controllers/AccountController.cs



[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)

{

await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);


using (ApplicationDbContext db = new ApplicationDbContext())

{

UsersInfoes UsersInfo = new UsersInfoes();

UsersInfo .Id = user.Id;

UsersInfo .UserNick = model.UserNick.Replace(" ", string.Empty);

UsersInfo .DateC = DateTime.Now;


db.UInfoes.Add(UsersInfo );

db.SaveChanges();

}


return RedirectToAction("Index", "Home");

}

AddErrors(result);

}


return View(model);

}



5. 실행


1) 등록으로가서 테스트를 해보도록 하자. 아래는 샘플이다. 정상적으로 잘 작동할것이다.



6. 확인


1) 데이터베이스에 생성된 테이블 확인.

- AspNetUsers : 기본 사용자 테이블

- UsersInfoes : 추가 정보 테이블


2) UsersInfoes 테이블 디자인 화면. 추가한 컬럼들이 잘 보인다.




모든 내용이 끝났다. 조금 더 다루고 싶은 부분도 있었으나...

이거 작성만으로도 나름 꽤 힘들어서 여기서 마무리 짓겠습니다.





Posted by T.t.
: