public async Task <IActionResult> OnPostAsync(string code)
        {
            ReturnUrl ??= "/Index";
            if (!TempData.TryGetValue("VerificationSecret", out object secretKey))
            {
                return(RedirectToPage("/User/Login", new { ReturnUrl }));
            }

            if (!TempData.TryGetValue("Phone", out object phone))
            {
                return(RedirectToPage("/User/Login", new { ReturnUrl }));
            }

            var internationalPhone = new InternationalPhone((string)phone);
            var info = new UserVerificationInfo(internationalPhone, (string)secretKey);

            if (!verificationService.CheckVerificationCode(info, code))
            {
                // Prevent deletion of secret if code was entered incorrectly.
                TempData.Keep();
                return(Page());
            }

            await identityService.SignInOrRegisterWithPhoneAsync(internationalPhone);

            return(LocalRedirect(ReturnUrl));
        }
Esempio n. 2
0
        public async Task <IActionResult> Post(string username)
        {
            if (username == null)
            {
                return(this.NotFound());
            }

            try
            {
                var userVerificationInfo = new UserVerificationInfo
                {
                    Username       = username,
                    CreationDate   = DateTime.Now,
                    ExpirationDate = DateTime.Now.AddHours(2)
                };

                using (var rng = new RNGCryptoServiceProvider())
                {
                    var buffer = new byte[8];

                    rng.GetBytes(buffer);

                    userVerificationInfo.VerificationKey = Convert.ToBase64String(buffer);
                }

                var result = (Error)await this._dm.OperateAsync <UserVerificationInfo, object>(
                    Constants.AddVerificationKey, userVerificationInfo);

                if (result == Error.VerificationCodeCreationFail)
                {
                    this._logger.Log(
                        LogHelper.CreateLog(DateTime.Now, LogType.Fail, Constants.VerificationKeyCreationFail, null));

                    return(this.BadRequest(Constants.VerificationKeyCreationFail));
                }

                if (result == Error.VerificationCodeCreationSuccess)
                {
                    var user = (User)await this._dm.OperateAsync <string, User>(
                        Constants.GetUserByUsername, userVerificationInfo.Username);

                    await this._mailer.SendAsync(
                        user.Email, Constants.VerificationSubject, false, userVerificationInfo.VerificationKey);

                    return(this.Ok(Constants.VerificationCreationSuccess));
                }

                return(this.BadRequest());
            }
            catch (Exception ex)
            {
                this._logger.Log(
                    LogHelper.CreateLog(DateTime.Now, LogType.Fatal, Constants.VerificationKeyCreationFail, ex));

                return(this.StatusCode(StatusCodes.Status500InternalServerError));
            }
        }
        public IActionResult Put([FromBody] UserVerificationInfo userVerificationInfo)
        {
            // if user verification succeeds return 200
            if (this._verifier.Verify(userVerificationInfo))
            {
                return(new StatusCodeResult(200));
            }

            // return Bad Request code
            return(new StatusCodeResult(400));
        }
Esempio n. 4
0
        public async Task <IActionResult> OnPostAsync(string phone)
        {
            if (InternationalPhone.TryParse(phone, out InternationalPhone parsed))
            {
                UserVerificationInfo info = await verificationService.SendVerificationCodeAsync(parsed);

                TempData["VerificationSecret"] = info.SecretKey;
                TempData["Phone"] = info.Phone.Formatted;
                return(RedirectToPage("/User/Verify", new { ReturnUrl }));
            }

            return(Page());
        }
Esempio n. 5
0
        /// <summary>
        /// Verifies the user if key is correct.
        /// </summary>
        /// <param name="userVerificationInfo">User verification information</param>
        /// <returns>true,if user is verified,and false otherwise</returns>
        public bool Verify(UserVerificationInfo userVerificationInfo)
        {
            // trying to verify user
            var result = (int)this._dataManager.Operate <UserVerificationInfo, object>("VerifyUser", userVerificationInfo);

            // if user verification fails return false
            if (result == 0)
            {
                return(false);
            }

            // return true
            return(true);
        }
Esempio n. 6
0
        /// <summary>
        /// Verifies user
        /// </summary>
        /// <param name="userVerificationInfo">User verification information</param>
        /// <returns>response</returns>
        public async Task <Response <HttpResponseMessage> > VerifyAsync(UserVerificationInfo userVerificationInfo)
        {
            // getting response
            var response = await this._registerClient.PutAsync("api/register/verify", this.ConstructContent(userVerificationInfo));

            if (!response.IsSuccessStatusCode)
            {
                return(this.ConstructResponse(Status.Error, response));
            }

            // reading content
            var content = await response.Content.ReadAsStringAsync();

            // returning response
            return(this.ConstructResponse(Status.Ok, response));
        }
Esempio n. 7
0
        /// <summary>
        /// Adds verification info to database
        /// </summary>
        /// <param name="id">Id</param>
        /// <param name="mail">Mail address to which verification key must be sent.</param>
        public void AddVerificationInfo(string username, string mail)
        {
            // generating key
            var key = this.GenerateVerifyKey(32);

            // constructing verification info
            var verificationInfo = new UserVerificationInfo
            {
                Username  = username,
                VerifyKey = key
            };

            // adding verification key
            this._dataManager.Operate <UserVerificationInfo, object>("AddVerificationKey", verificationInfo);

            // sending verifiaction key to mail
            this._mailService.Send(mail, key);
        }