public async Task ValidateAsync(string captchaResponse)
        {
            var httpContext = _httpContextAccessor.HttpContext;

            if (httpContext == null)
            {
                throw new Exception("RecaptchaValidator should be used in a valid HTTP context!");
            }

            if (captchaResponse.IsNullOrEmpty())
            {
                throw new UserFriendlyException(L("CaptchaCanNotBeEmpty"));
            }

            var response = await _reCAPTCHASiteVerifyV3.Verify(new reCAPTCHASiteVerifyRequest
            {
                Response = captchaResponse,
                RemoteIp = _httpContextAccessor.HttpContext.Connection?.RemoteIpAddress?.ToString()
            });

            if (!response.Success || response.Score < 0.5)
            {
                Logger.Warn(response.ToJsonString());
                throw new UserFriendlyException(L("IncorrectCaptchaAnswer"));
            }
        }
示例#2
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl = returnUrl ?? Url.Content("~/");

            /*      Captcha     */
            var response = await _siteVerify.Verify(new reCAPTCHASiteVerifyRequest
            {
                Response = Input.token,
                RemoteIp = HttpContext.Connection.RemoteIpAddress.ToString()
            });

            if (response.Score < 0.5 || response.Success == false) // gdy niski poziom zaufania lub gdy wogóle się nie powiodło
            {
                _logger.LogInformation("\n " + "\n " + "token " + response.Success + "  score: " + response.Score + "\n " + "\n ");
                ModelState.AddModelError("token", "Nie powiodła się weryfikacja");
                return(Page());
            }
            _logger.LogInformation("Success: " + response.Success + "\t       Score: " + response.Score);
            /*      Captcha     */

            if (ModelState.IsValid)
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, Input.RememberMe, lockoutOnFailure : false);

                if (result.Succeeded)
                {
                    _logger.LogInformation("Zalogowano.");
                    return(LocalRedirect(returnUrl));
                }

                /*
                 * if (result.RequiresTwoFactor)
                 * {
                 *  return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
                 * }
                 */
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("Użytkownik zablokowany.");
                    ModelState.AddModelError(string.Empty, "Użytkownik zbanowany");
                    return(Page());
                }
                if (result.IsNotAllowed)
                {
                    ModelState.AddModelError(string.Empty, "Konto nie potwierdzone");
                    return(Page());
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Nie udało się zalogować :(");
                    return(Page());
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }
示例#3
0
        public async Task OnPostAsync(string token)
        {
            var response = await _siteVerify.Verify(new reCAPTCHASiteVerifyRequest
            {
                Response = token,
                RemoteIp = HttpContext.Connection.RemoteIpAddress.ToString()
            });

            Result = JsonConvert.SerializeObject(response, Formatting.Indented);
        }
示例#4
0
        public async Task OnPostAsync(string token)
        {
            var response = await _siteVerify.Verify(new reCAPTCHASiteVerifyRequest
            {
                Response = token,
                RemoteIp = HttpContext.Connection.RemoteIpAddress?.ToString()
            });

            Result = JsonSerializer.Serialize(response, new JsonSerializerOptions
            {
                WriteIndented = true
            });
        }
示例#5
0
        public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            if (!_options.Enabled)
            {
                await next();

                return;
            }

            if (context.HttpContext.Request.Headers.ContainsKey(_options.HeaderKey))
            {
                string googleRecaptchaToken = context.HttpContext.Request.Headers[_options.HeaderKey].ToString();

                if (googleRecaptchaToken.IsNullOrEmpty())
                {
                    throw new LinCmsException("验证参数不存在,人机验证失败!");
                }

                try
                {
                    reCAPTCHASiteVerifyV3Response response = await _siteVerify.Verify(new reCAPTCHASiteVerifyRequest
                    {
                        Response = googleRecaptchaToken,
                        RemoteIp = context.HttpContext.Connection.RemoteIpAddress.ToString()
                    });

                    if (!response.Success || response.Score != 0 && response.Score < _options.MinimumScore)
                    {
                        throw new LinCmsException("人机验证失败!");
                    }
                }
                catch (NetworkInformationException ex)
                {
                    _logger.LogError($"Google人机验证网络请求失败:{ex.Message}{ex.StackTrace}");
                }

                await next();

                return;
            }

            throw new LinCmsException("人机验证失败,请检查参数!");
        }
示例#6
0
        public async Task <IActionResult> OnPostAsync(string returnUrl = null)
        {
            returnUrl      = returnUrl ?? Url.Content("~/");
            ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();


            /*      Captcha     */
            var response = await _siteVerify.Verify(new reCAPTCHASiteVerifyRequest
            {
                Response = Input.token,
                RemoteIp = HttpContext.Connection.RemoteIpAddress.ToString()
            });

            if (response.Score < 0.5 || response.Success == false) // gdy niski poziom zaufania lub gdy wogóle się nie powiodło
            {
                _logger.LogInformation("\n " + "\n " + "token " + response.Success + "  score: " + response.Score + "\n " + "\n ");
                ModelState.AddModelError("token", "Nie powiodła się weryfikacja");
                return(Page());
            }
            _logger.LogInformation("Success: " + response.Success + "\t       Score: " + response.Score);
            /*      Captcha     */


            if (ModelState.IsValid)
            {
                var user = new IdentityUser {
                    UserName = Input.Email, Email = Input.Email
                };
                var result = await _userManager.CreateAsync(user, Input.Password);

                if (result.Succeeded)
                {
                    _logger.LogInformation("Użytkownik stworzony.");

                    var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);

                    code = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(code));
                    var callbackUrl = Url.Page(
                        "/Account/ConfirmEmail",
                        pageHandler: null,
                        values: new { area = "Identity", userId = user.Id, code = code, returnUrl = returnUrl },
                        protocol: Request.Scheme);

                    SendMail email = new SendMail();



                    string msg = $"<a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>Kliknij na link, aby aktywować konto!</a>.";

                    email.SendEmail(Input.Email, "Rejestracja - Ridentia", msg);

                    TempData["CheckEmail"] = "Aby aktywować konto musisz wejść na email i wejść w link aktywacyjny! ";


                    if (_userManager.Options.SignIn.RequireConfirmedAccount)
                    {
                        return(RedirectToPage("RegisterConfirmation", new { email = Input.Email, returnUrl = returnUrl }));
                    }
                    else
                    {
                        await _signInManager.SignInAsync(user, isPersistent : false);

                        return(LocalRedirect(returnUrl));
                    }
                }
                foreach (var error in result.Errors)
                {
                    ModelState.AddModelError(string.Empty, error.Description);
                }
            }

            // If we got this far, something failed, redisplay form
            return(Page());
        }