Edi.Captcha 3.25.0

dotnet add package Edi.Captcha --version 3.25.0                
NuGet\Install-Package Edi.Captcha -Version 3.25.0                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Edi.Captcha" Version="3.25.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add Edi.Captcha --version 3.25.0                
#r "nuget: Edi.Captcha, 3.25.0"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install Edi.Captcha as a Cake Addin
#addin nuget:?package=Edi.Captcha&version=3.25.0

// Install Edi.Captcha as a Cake Tool
#tool nuget:?package=Edi.Captcha&version=3.25.0                

Edi.Captcha.AspNetCore

The Captcha module used in my blog

.NET

NuGet

Usage

0. Install from NuGet

NuGet Package Manager

Install-Package Edi.Captcha

or .NET CLI

dotnet add package Edi.Captcha

1. Register in DI

services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(20);
    options.Cookie.HttpOnly = true;
});

services.AddSessionBasedCaptcha();
// Don't forget to add this line in your `Configure` method.
 app.UseSession();

or you can customize the options

services.AddSessionBasedCaptcha(option =>
{
    option.Letters = "2346789ABCDEFGHJKLMNPRTUVWXYZ";
    option.SessionName = "CaptchaCode";
    option.CodeLength = 4;
});

2. Generate Image

Using MVC Controller
private readonly ISessionBasedCaptcha _captcha;

public SomeController(ISessionBasedCaptcha captcha)
{
    _captcha = captcha;
}

[Route("get-captcha-image")]
public IActionResult GetCaptchaImage()
{
    var s = _captcha.GenerateCaptchaImageFileStream(
        HttpContext.Session,
        100,
        36
    );
    return s;
}
Using Middleware
app.UseSession().UseCaptchaImage(options =>
{
    options.RequestPath = "/captcha-image";
    options.ImageHeight = 36;
    options.ImageWidth = 100;
});

3. Add CaptchaCode Property to Model

[Required]
[StringLength(4)]
public string CaptchaCode { get; set; }

5. View

<div class="col">
    <div class="input-group">
        <div class="input-group-prepend">
            <img id="img-captcha" src="~/captcha-image" />
        </div>
        <input type="text" 
               asp-for="CommentPostModel.CaptchaCode" 
               class="form-control" 
               placeholder="Captcha Code" 
               autocomplete="off" 
               minlength="4"
               maxlength="4" />
    </div>
    <span asp-validation-for="CommentPostModel.CaptchaCode" class="text-danger"></span>
</div>

6. Validate Input

_captcha.ValidateCaptchaCode(model.CommentPostModel.CaptchaCode, HttpContext.Session)

To make your code look more cool, you can also write an Action Filter like this:

public class ValidateCaptcha : ActionFilterAttribute
{
    private readonly ISessionBasedCaptcha _captcha;

    public ValidateCaptcha(ISessionBasedCaptcha captcha)
    {
        _captcha = captcha;
    }

    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var captchaedModel =
            context.ActionArguments.Where(p => p.Value is ICaptchable)
                                   .Select(x => x.Value as ICaptchable)
                                   .FirstOrDefault();

        if (null == captchaedModel)
        {
            context.ModelState.AddModelError(nameof(captchaedModel.CaptchaCode), "Captcha Code is required");
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
        else
        {
            if (!_captcha.Validate(captchaedModel.CaptchaCode, context.HttpContext.Session))
            {
                context.ModelState.AddModelError(nameof(captchaedModel.CaptchaCode), "Wrong Captcha Code");
                context.Result = new ConflictObjectResult(context.ModelState);
            }
            else
            {
                base.OnActionExecuting(context);
            }
        }
    }
}

and then

services.AddScoped<ValidateCaptcha>();

and then


public class YourModelWithCaptchaCode : ICaptchable
{
    public string YourProperty { get; set; }

    [Required]
    [StringLength(4)]
    public string CaptchaCode { get; set; }
}

[ServiceFilter(typeof(ValidateCaptcha))]
public async Task<IActionResult> SomeAction(YourModelWithCaptchaCode model)
{
    // ....
}

Refer to https://edi.wang/post/2018/10/13/generate-captcha-code-aspnet-core

免责申明

此项目(Edi.Captcha.AspNetCore)及其配套组件均为免费开源的产品,仅用于学习交流,并且不直接向中国提供服务,中国访客请于下载后立即删除。

任何中国境内的组织及个人不得使用此项目(Edi.Captcha.AspNetCore)及其配套组件构建任何形式的面向中国境内访客的网站或服务。

不可用于任何违反中华人民共和国(含台湾省)或使用者所在地区法律法规的用途。

因为作者即本人仅完成代码的开发和开源活动(开源即任何人都可以下载使用),从未参与访客的任何运营和盈利活动。

且不知晓访客后续将程序源代码用于何种用途,故访客使用过程中所带来的任何法律责任即由访客自己承担。

《开源软件有漏洞,作者需要负责吗?是的!》

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Edi.Captcha:

Package Downloads
MoongladePure.Comments

Package Description

GitHub repositories (2)

Showing the top 2 popular GitHub repositories that depend on Edi.Captcha:

Repository Stars
EdiWang/Moonglade
Blog system of https://edi.wang, runs on Microsoft Azure
AiursoftWeb/Infrastructures
Mirror of: https://gitlab.aiursoft.cn/aiursoft/infrastructures
Version Downloads Last updated
3.25.0 507 11/13/2024
3.24.0 1,237 8/11/2024
3.23.1 520 7/14/2024
3.23.0 173 7/8/2024
3.22.0 940 5/19/2024
3.21.2 1,095 3/11/2024
3.21.1 1,121 1/29/2024
3.21.0 898 12/15/2023
3.20.0 312 12/11/2023
3.19.1 1,376 11/6/2023
3.19.0 531 10/11/2023
3.18.0 766 9/16/2023
3.17.0 570 8/29/2023
3.16.0 861 7/13/2023
3.15.0 4,124 1/5/2023
3.14.0 1,328 11/9/2022
3.13.1 3,796 9/14/2022
3.13.0 4,130 7/31/2022
3.12.0 408 7/31/2022
3.11.0 1,550 6/12/2022
3.10.0 2,565 2/9/2022
3.9.0 568 1/10/2022
3.8.0 270 1/9/2022
3.7.0 450 12/9/2021
3.6.1 818 12/8/2021
3.6.0 511 11/13/2021
3.5.0 496 11/9/2021
3.4.0 356 11/9/2021
3.3.0 2,041 6/7/2021
3.2.0 1,429 4/1/2021
3.1.0 428 3/31/2021
3.0.1 2,990 11/27/2020
3.0.0 656 11/11/2020
2.2.0 3,909 12/4/2019
2.1.0 639 11/22/2019
2.0.0 1,025 9/24/2019
2.0.0-preview3 291 9/17/2019
2.0.0-preview2 288 9/15/2019
2.0.0-preview 292 9/11/2019
1.3.1 1,430 5/1/2019
1.3.0 689 4/11/2019
1.2.0 885 1/30/2019
1.1.0 763 12/13/2018
1.0.0 1,436 11/11/2018