public IActionResult Register(string returnUrl)
        {
            if (User.IsAuthenticated())
            {
                return(Redirect("~/"));
            }
            var model = new RegisterInputModel();

            model.ReturnUrl = returnUrl;
            // var bModel = JsonConvert.DeserializeObject<BasicRegisterViewModel>();

            return(View(model));
        }
        public async Task <IActionResult> Register(RegisterInputModel model)
        {
            // check if we are in the context of an authorization request
            var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);

            if (ModelState.IsValid)
            {
                var user = await _identityService.UserManager.FindByEmailAsync(model.Email);

                if (user != null)
                {
                    ModelState.AddModelError("Exist", "Email is already used");
                    return(View(model));
                }

                user = new User
                {
                    Email              = model.Email,
                    NormalizedEmail    = model.Email.ToUpper(),
                    UserName           = model.Email,
                    NormalizedUserName = model.Email.ToUpper(),
                    SecurityStamp      = Guid.NewGuid().ToString(),
                    HasPassword        = true
                };


                var claims = new List <Claim>()
                {
                    new Claim(ClaimTypes.GivenName, model.FirstName),
                    new Claim(ClaimTypes.Surname, model.LastName),
                };

                var umResult = await _identityService.UserManager.CreateAsync(user, model.Password);

                if (umResult.Succeeded)
                {
                    user = await _identityService.UserManager.FindByEmailAsync(user.Email);

                    await _identityService.UserManager.AddToRoleAsync(user, "user");

                    foreach (var c in claims)
                    {
                        await _identityService.UserManager.AddClaimAsync(user, c);
                    }
                    // return View("Login", new { returnUrl = model.ReturnUrl});
                }
                foreach (var error in umResult.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }


                var signInResult = await _signInManager.CheckPasswordSignInAsync(user, model.Password, false);

                if (!signInResult.IsLockedOut && signInResult.Succeeded)
                {
                    await _events.RaiseAsync(new UserLoginSuccessEvent(user.UserName, user.Id.ToString(), user.UserName));

                    // only set explicit expiration here if user chooses "remember me".
                    // otherwise we rely upon expiration configured in cookie middleware.
                    AuthenticationProperties props = null;
                    if (AccountOptions.AllowRememberLogin && model.RememberLogin)
                    {
                        props = new AuthenticationProperties
                        {
                            IsPersistent = true,
                            ExpiresUtc   = DateTimeOffset.UtcNow.Add(AccountOptions.RememberMeLoginDuration)
                        };
                    }
                    ;

                    // issue authentication cookie with subject ID and username
                    await HttpContext.SignInAsync(user.Id.ToString(), user.UserName, props);

                    if (context != null)
                    {
                        if (await _clientStore.IsPkceClientAsync(context.ClientId))
                        {
                            // if the client is PKCE then we assume it's native, so this change in how to
                            // return the response is for better UX for the end user.
                            return(View("Redirect", new RedirectViewModel {
                                RedirectUrl = model.ReturnUrl
                            }));
                        }

                        // we can trust model.ReturnUrl since GetAuthorizationContextAsync returned non-null
                        return(Redirect(model.ReturnUrl));
                    }

                    // request for a local page
                    if (Url.IsLocalUrl(model.ReturnUrl))
                    {
                        return(Redirect(model.ReturnUrl));
                    }
                    else if (string.IsNullOrEmpty(model.ReturnUrl))
                    {
                        return(Redirect("~/"));
                    }
                    else
                    {
                        // user might have clicked on a malicious link - should be logged
                        throw new Exception("invalid return URL");
                    }
                }
            }


            return(View(model));
        }