{"id":13437760,"url":"https://github.com/EdiWang/Edi.Captcha.AspNetCore","last_synced_at":"2025-03-19T18:30:38.321Z","repository":{"id":36065864,"uuid":"157058716","full_name":"EdiWang/Edi.Captcha.AspNetCore","owner":"EdiWang","description":"The Captcha module used in my blog","archived":false,"fork":false,"pushed_at":"2024-08-11T05:03:52.000Z","size":752,"stargazers_count":65,"open_issues_count":2,"forks_count":12,"subscribers_count":4,"default_branch":"master","last_synced_at":"2024-08-11T06:20:59.434Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/EdiWang.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-11-11T07:52:55.000Z","updated_at":"2024-08-11T05:03:55.000Z","dependencies_parsed_at":"2024-01-29T07:30:30.083Z","dependency_job_id":"b49fdd93-c438-4d88-9cad-0b71a7c3ce5f","html_url":"https://github.com/EdiWang/Edi.Captcha.AspNetCore","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdiWang%2FEdi.Captcha.AspNetCore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdiWang%2FEdi.Captcha.AspNetCore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdiWang%2FEdi.Captcha.AspNetCore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/EdiWang%2FEdi.Captcha.AspNetCore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/EdiWang","download_url":"https://codeload.github.com/EdiWang/Edi.Captcha.AspNetCore/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221729735,"owners_count":16871094,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-07-31T03:01:00.028Z","updated_at":"2025-03-19T18:30:38.308Z","avatar_url":"https://github.com/EdiWang.png","language":"C#","funding_links":[],"categories":["HarmonyOS","C\\#"],"sub_categories":["Windows Manager"],"readme":"# Edi.Captcha.AspNetCore\nThe Captcha module used in my blog\n\n[![.NET](https://github.com/EdiWang/Edi.Captcha.AspNetCore/actions/workflows/dotnet.yml/badge.svg)](https://github.com/EdiWang/Edi.Captcha.AspNetCore/actions/workflows/dotnet.yml)\n\n[![NuGet][main-nuget-badge]][main-nuget]\n\n[main-nuget]: https://www.nuget.org/packages/Edi.Captcha/\n[main-nuget-badge]: https://img.shields.io/nuget/v/Edi.Captcha.svg?style=flat-square\u0026label=nuget\n\n## Usage\n\n### 0. Install from NuGet\n\nNuGet Package Manager\n```\nInstall-Package Edi.Captcha\n```\n\nor .NET CLI\n\n```\ndotnet add package Edi.Captcha\n```\n\n### 1. Register in DI\n\n```csharp\nservices.AddSession(options =\u003e\n{\n    options.IdleTimeout = TimeSpan.FromMinutes(20);\n    options.Cookie.HttpOnly = true;\n});\n\nservices.AddSessionBasedCaptcha();\n```\n\n```csharp\n// Don't forget to add this line in your `Configure` method.\n app.UseSession();\n```\n\nor you can customize the options\n\n```csharp\nservices.AddSessionBasedCaptcha(option =\u003e\n{\n    option.Letters = \"2346789ABCDEFGHJKLMNPRTUVWXYZ\";\n    option.SessionName = \"CaptchaCode\";\n    option.CodeLength = 4;\n});\n```\n\n### 2. Generate Image\n\n#### Using MVC Controller\n\n```csharp\nprivate readonly ISessionBasedCaptcha _captcha;\n\npublic SomeController(ISessionBasedCaptcha captcha)\n{\n    _captcha = captcha;\n}\n\n[Route(\"get-captcha-image\")]\npublic IActionResult GetCaptchaImage()\n{\n    var s = _captcha.GenerateCaptchaImageFileStream(\n        HttpContext.Session,\n        100,\n        36\n    );\n    return s;\n}\n```\n\n#### Using Middleware\n\n```csharp\napp.UseSession().UseCaptchaImage(options =\u003e\n{\n    options.RequestPath = \"/captcha-image\";\n    options.ImageHeight = 36;\n    options.ImageWidth = 100;\n});\n```\n\n### 3. Add CaptchaCode Property to Model\n\n```csharp\n[Required]\n[StringLength(4)]\npublic string CaptchaCode { get; set; }\n```\n\n### 5. View\n\n```html\n\u003cdiv class=\"col\"\u003e\n    \u003cdiv class=\"input-group\"\u003e\n        \u003cdiv class=\"input-group-prepend\"\u003e\n            \u003cimg id=\"img-captcha\" src=\"~/captcha-image\" /\u003e\n        \u003c/div\u003e\n        \u003cinput type=\"text\" \n               asp-for=\"CommentPostModel.CaptchaCode\" \n               class=\"form-control\" \n               placeholder=\"Captcha Code\" \n               autocomplete=\"off\" \n               minlength=\"4\"\n               maxlength=\"4\" /\u003e\n    \u003c/div\u003e\n    \u003cspan asp-validation-for=\"CommentPostModel.CaptchaCode\" class=\"text-danger\"\u003e\u003c/span\u003e\n\u003c/div\u003e\n```\n\n### 6. Validate Input\n\n```csharp\n_captcha.ValidateCaptchaCode(model.CommentPostModel.CaptchaCode, HttpContext.Session)\n```\n\nTo make your code look more cool, you can also write an Action Filter like this:\n\n```csharp\npublic class ValidateCaptcha : ActionFilterAttribute\n{\n    private readonly ISessionBasedCaptcha _captcha;\n\n    public ValidateCaptcha(ISessionBasedCaptcha captcha)\n    {\n        _captcha = captcha;\n    }\n\n    public override void OnActionExecuting(ActionExecutingContext context)\n    {\n        var captchaedModel =\n            context.ActionArguments.Where(p =\u003e p.Value is ICaptchable)\n                                   .Select(x =\u003e x.Value as ICaptchable)\n                                   .FirstOrDefault();\n\n        if (null == captchaedModel)\n        {\n            context.ModelState.AddModelError(nameof(captchaedModel.CaptchaCode), \"Captcha Code is required\");\n            context.Result = new BadRequestObjectResult(context.ModelState);\n        }\n        else\n        {\n            if (!_captcha.Validate(captchaedModel.CaptchaCode, context.HttpContext.Session))\n            {\n                context.ModelState.AddModelError(nameof(captchaedModel.CaptchaCode), \"Wrong Captcha Code\");\n                context.Result = new ConflictObjectResult(context.ModelState);\n            }\n            else\n            {\n                base.OnActionExecuting(context);\n            }\n        }\n    }\n}\n```\n\nand then\n\n```csharp\nservices.AddScoped\u003cValidateCaptcha\u003e();\n```\n\nand then\n\n```csharp\n\npublic class YourModelWithCaptchaCode : ICaptchable\n{\n    public string YourProperty { get; set; }\n\n    [Required]\n    [StringLength(4)]\n    public string CaptchaCode { get; set; }\n}\n\n[ServiceFilter(typeof(ValidateCaptcha))]\npublic async Task\u003cIActionResult\u003e SomeAction(YourModelWithCaptchaCode model)\n{\n    // ....\n}\n```\n\nRefer to https://edi.wang/post/2018/10/13/generate-captcha-code-aspnet-core\n\n## 免责申明\n\n此项目(Edi.Captcha.AspNetCore)及其配套组件均为免费开源的产品，仅用于学习交流，并且不直接向中国提供服务，中国访客请于下载后立即删除。\n\n任何中国境内的组织及个人不得使用此项目(Edi.Captcha.AspNetCore)及其配套组件构建任何形式的面向中国境内访客的网站或服务。\n\n不可用于任何违反中华人民共和国(含台湾省)或使用者所在地区法律法规的用途。\n\n因为作者即本人仅完成代码的开发和开源活动(开源即任何人都可以下载使用)，从未参与访客的任何运营和盈利活动。\n\n且不知晓访客后续将程序源代码用于何种用途，故访客使用过程中所带来的任何法律责任即由访客自己承担。\n\n[《开源软件有漏洞，作者需要负责吗？是的！》](https://go.edi.wang/aka/os251)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEdiWang%2FEdi.Captcha.AspNetCore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FEdiWang%2FEdi.Captcha.AspNetCore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FEdiWang%2FEdi.Captcha.AspNetCore/lists"}