public IActionResult RegisterUser(string returnUrl)
        {
            var vm = new UserRegistrationViewModel()
            {
                ReturnUrl = returnUrl
            };

            return(View(vm));
        }
        public async Task <IActionResult> RegisterUser(UserRegistrationViewModel model)
        {
            if (ModelState.IsValid)
            {
                // create user + claims
                var userToCreate = new User()
                {
                    Username  = model.Username,
                    Password  = model.Password,
                    FirstName = model.Firstname,
                    LastName  = model.Lastname,
                    Email     = model.Email
                };
                userToCreate.Claims.Add(new UserClaim(JwtClaimTypes.Role, "user"));
                userToCreate.Claims.Add(new UserClaim(JwtClaimTypes.GivenName, model.Firstname));
                userToCreate.Claims.Add(new UserClaim(JwtClaimTypes.FamilyName, model.Lastname));
                userToCreate.Claims.Add(new UserClaim(JwtClaimTypes.Email, model.Email));
                userToCreate.Claims.Add(new UserClaim(JwtClaimTypes.Name, model.Username));

                // add the user through the API.
                using (var client = new HttpClient())
                {
                    StringContent content  = new StringContent(JsonConvert.SerializeObject(userToCreate), Encoding.UTF8, "application/json");
                    var           response = await client.PostAsync($"http://localhost:53920/api/users", content);

                    if (response.StatusCode != HttpStatusCode.Created)
                    {
                        throw new Exception($"Creating a user failed.");
                    }
                }
                var createdUser = await _userRepository.GetByUsername(model.Username);

                // log the user in
                await HttpContext.SignInAsync(createdUser.SubjectId, createdUser.Username);

                // continue with the flow
                if (_interaction.IsValidReturnUrl(model.ReturnUrl) || Url.IsLocalUrl(model.ReturnUrl))
                {
                    return(Redirect(model.ReturnUrl));
                }

                return(Redirect("~/"));
            }

            // ModelState invalid, return the view with the passed-in model
            // so changes can be made
            return(View(model));
        }