2016-05-14 2 views
5

Я разрабатываю приложение asp.net MVC 6 в ядре asp.net, и я хочу создать captcha для моей страницы входа. в предыдущих .net frameworks я использовал system.drawing для создания captcha, но так как в ядре framework .net мы не имеем system.drawing, как я могу это достичь?Как создать капчу в asp.net core Asp.net Mvc 6?

Одним из решений является ссылка на полный .net framework, но это не то, что я хочу. Я хочу использовать базовую структуру.

еще один должен создать проект с .net framework 6 и Mvc 5 и использовать веб-api для получения изображения captcha, но и это не то, что я хочу.

есть ли другое решение?

+0

бы вы ни делали, не используйте https://captcha.com/asp.net-captcha.html. .. он вызывает режим прерывания приложения: | – AmiNadimi

ответ

0

Для создания Captcha в Mvc выполните следующие шаги.

  1. Добавьте библиотеку CaptchaMvc в ссылочный уровень в своем приложении, как это.

  2. Теперь создайте индексный указатель следующим образом.

Просмотр

@using CaptchaMvc.HtmlHelpers 
@using MathCaptcha; 
@using CaptchaMvc; 

@using (Html.BeginForm()) { 
@Html.ValidationSummary(true) 

<fieldset> 
    <legend>Captcha Example</legend> 

    @Html.MathCaptcha() 

    @*@Html.Captcha(3)*@ 

    <input type="submit" value="Send" /> 

</fieldset> 
} 

@ Html.MathCaptcha() вспомогательный класс, то он будет генерировать mathmatical CAPTCHA. Если вы используете @Html. Captcha (3), тогда он будет генерировать Char CAPTCHA. 3 - длина CAPTCHA.

  1. В методе post action я написал код для проверки CAPTCHA.

    [HttpPost] 
    public ActionResult Index(string empty) 
    { 
        // Code to validate the CAPTCHA image 
        if (this.IsCaptchaValid("Captcha not valid")) 
        { 
    
         // do your stuff 
        } 
    
        return View(); 
    } 
    
+0

Я использую новую версию .net framework. ваше решение для mvc 5 не mvc 6. – elhampour

6

Я реализовал ReCaptcha в моих Ключевых приложениях ASP.NET. На мой взгляд входа:

@if (Model.RecaptchaSiteKey.Length > 0) 
{ 
    <script src='https://www.google.com/recaptcha/api.js'></script> 
} 


@if (Model.RecaptchaSiteKey.Length > 0) 
{ 
    <div class="form-group"> 
     <div class="col-md-offset-2 col-md-10"> 
      <div class="g-recaptcha" data-sitekey="@Model.RecaptchaSiteKey"></div> 
      @Html.ValidationMessage("recaptchaerror", new { @class = "text-danger" }) 
     </div> 
    </div> 

} 

я реализовал метод расширения на контроллере, так что я могу проверить на стороне сервера CAPTCHA, легко из любого контроллера, где я использую его.

public static async Task<RecaptchaResponse> ValidateRecaptcha(
    this Controller controller, 
    HttpRequest request, 
    string secretKey) 
{ 
    var response = request.Form["g-recaptcha-response"]; 
    var client = new HttpClient(); 
    string result = await client.GetStringAsync(
     string.Format("https://www.google.com/recaptcha/api/siteverify?secret={0}&response={1}", 
      secretKey, 
      response) 
      ); 

    var captchaResponse = JsonConvert.DeserializeObject<RecaptchaResponse>(result); 

    return captchaResponse; 
} 

Затем этот фрагмент из метода после входа в моем AccountController проверяет сторону CAPTCHA на сервере, используя этот метод расширения:

if ((Site.CaptchaOnLogin) && (Site.RecaptchaPublicKey.Length > 0)) 
{ 
    var recpatchaSecretKey = Site.RecaptchaPrivateKey; 
    var captchaResponse = await this.ValidateRecaptcha(Request, recpatchaSecretKey); 

    if (!captchaResponse.Success) 
    { 
     ModelState.AddModelError("recaptchaerror", "reCAPTCHA Error occured. Please try again"); 
     return View(model); 
    } 
} 

Обратите внимание, что для вызова методов расширения на контроллере вы должны использовать этот ключевое слово.

Я использую это в нескольких проектах в настоящее время, так что если вы хотите увидеть больше кода, самый простой в моей SimpleAuth проекте, но я также использую его cloudscribe

+0

tnx для вас решение. но я не хочу получать изображение captcha с другого сервера, я хочу создать его в своем проекте. в этот момент я создаю еще один проект (проект web-api), который дает мне изображение. как подсказка, которую вы предлагаете. – elhampour

+0

не уверен, что он готов к использованию, но, возможно, посмотрите на это https://github.com/JimBobSquarePants/ImageProcessor. Я знаю, что они работают над поддержкой .NET Core, но не уверены, как далеко продвинулись они –

+0

ImageProcessor уже поддерживает .NET. ядро. К сожалению, не удается (AFAIK) рисовать, «только» манипулировать существующими изображениями – psousa

7

Я сделал обертку для рекапчи что работает с aspnetcore, проверить его https://www.nuget.org/packages/PaulMiami.AspNetCore.Mvc.Recaptcha и есть некоторая документация на https://github.com/PaulMiami/reCAPTCHA/wiki/Getting-started

Короче говоря вам нужно сделать следующее, чтобы использовать его:

  1. Настройка службы в вашем классе вашего запуска.
public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(); 

    services.AddRecaptcha(new RecaptchaOptions 
    { 
     SiteKey = Configuration["Recaptcha:SiteKey"], 
     SecretKey = Configuration["Recaptcha:SecretKey"] 
    }); 
} 

2. В разделе "_ViewImports.cshtml" файл оный.

@addTagHelper *, PaulMiami.AspNetCore.Mvc.Recaptcha 

3. На ваш взгляд.

<form asp-controller="Home" asp-action="Index" method="post"> 
    <recaptcha /> 
    <input type="submit" value="submit" /> 
</form> 
@section Scripts { 
    <recaptcha-script /> 
} 

4. В контроллере.

[ValidateRecaptcha] 
[HttpPost] 
public IActionResult Index(YourViewModel viewModel) 
{ 
    if (ModelState.IsValid) 
    { 
     return new OkResult(); 
    } 

    return View(); 
} 
+0

, как бы вы изменили сообщение об ошибке для неправильного recaptcha subissin? – AmiNadimi

1

Вы можете сделать это без специальной упаковки. По данным сайта ReCaptcha -

стороны клиента Интеграция

Вставьте этот фрагмент перед закрывающим </head> тег на шаблоне HTML:

<script src='https://www.google.com/recaptcha/api.js'></script> 

Вставьте этот фрагмент в конце, где вы хотите появится виджет reCAPTCHA:

<div class="g-recaptcha" data-sitekey="YOURSITEKEY"></div> 

Server Side Integration

Когда ваши пользователи отправляют форму, в которую вы интегрировали reCAPTCHA, вы получите как часть полезной нагрузки строку с именем «g-recaptcha-response». Для того, чтобы проверить, является ли Google подтвердил, что пользователь, отправить запрос POST с этими параметрами:

URL: https://www.google.com/recaptcha/api/siteverify

секретный (обязательно): YOURSECRETKEY

ответ (обязательно): Значение «г -recaptcha-ответ».

remoteip: IP-адрес конечного пользователя.

+0

Как я уже упоминал в своем вопросе, я создал другой проект и воплотил способ, описанный с помощью моих собственных серверов, но я хочу получить капчу в mvc 6 и с новой .net новой технологией (ядро asp.net) – elhampour

+0

метод, который я описал, работает в MVC 6 и .NET Core. Я запускаю его уже. Если вы ищете пакет Nuget, я смог получить пакет, созданный @PaulMiami, для работы. – smulholland2

+0

вы делаете запрос на веб-api и получаете изображение, а также для проверки правильности captcha вы делаете еще один запрос веб-api, и они выполняли эту работу для вас, я знаю это, и я реализую ее с помощью своего собственного веб-api. я хочу использовать альтернативный lib для system.draw. потому что ядро ​​.net не реализовало его. – elhampour

Смежные вопросы