[FromBody] 속성을 JObject 매개변수와 함께 사용하여 프레임워크에 JSON 데이터를 JObject 객체에 바인딩하도록 지시합니다. 그런 다음 ToObject<T> 메서드를 사용하여 JObject를 RegisterViewModel 객체로 수동으로 변환할 수 있습니다.
public class AccountController : Controller
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly SignInManager<ApplicationUser> _signInManager;
private readonly IAntiforgery _antiforgery;
public AccountController(UserManager<ApplicationUser> userManager, SignInManager<ApplicationUser> signInManager, IAntiforgery antiforgery)
{
_userManager = userManager;
_signInManager = signInManager;
_antiforgery = antiforgery;
}
[HttpGet]
public IActionResult Register()
{
var tokens = _antiforgery.GetAndStoreTokens(HttpContext);
ViewBag.AntiforgeryToken = tokens.RequestToken;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Register([FromBody] JObject data)
{
if (ModelState.IsValid)
{
var model = data.ToObject<RegisterViewModel>();
var user = new ApplicationUser
{
UserName = model.Username
};
var result = await _userManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
await _signInManager.SignInAsync(user, isPersistent: false);
return RedirectToAction("Index", "Home");
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
return BadRequest(ModelState);
}
}
이렇게 변경하면 JSON 데이터가 RegisterViewModel 개체에 올바르게 바인딩되어 등록 작업에서 사용자 이름과 비밀번호에 액세스할 수 있습니다.
이 예제에서는 ASP.NET Core Identity를 사용한 비밀번호 해싱, IAntiforgery 서비스를 사용한 CSRF 보호, HTTPS 통신 적용을 포함했습니다. 이제 등록 작업은 위조 방지 토큰을 생성하고 저장한 다음 @Html.AntiForgeryToken() 헬퍼 메서드를 사용하여 등록 form 에 포함합니다.
form 에 submit 을 위한 AJAX 요청은 CSRF 보호를 위해 request headers(요청 헤더)에 CSRF protection(위변조 방지 토큰) 을 포함합니다. form data 는 form.serializeArray()를 사용하여 serialize 되고, Content-Type 헤더는 application/json 으로 설정하며, JSON.stringify()를 사용하여 데이터를 JSON으로 변환해서 JSON 형식으로 전송됩니다.