.NET Core 中生成验证码
生活随笔
收集整理的這篇文章主要介紹了
.NET Core 中生成验证码
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在開發中,有時候生成驗證碼的場景目前還是存在的,本篇演示不依賴第三方組件,生成隨機驗證碼圖片。
先添加驗證碼接口
public?interface?ICaptcha {///?<summary>///?生成隨機驗證碼///?</summary>///?<param?name="codeLength"></param>///?<returns></returns>Task<string>?GenerateRandomCaptchaAsync(int?codeLength?=?4);///?<summary>///?生成驗證碼圖片///?</summary>///?<param?name="captchaCode">驗證碼</param>///?<param?name="width">寬為0將根據驗證碼長度自動匹配合適寬度</param>///?<param?name="height">高</param>///?<returns></returns>Task<CaptchaResult>?GenerateCaptchaImageAsync(string?captchaCode,?int?width?=?0,?int?height?=?30); }驗證碼返回模型
public?class?CaptchaResult {///?<summary>///?CaptchaCode///?</summary>public?string?CaptchaCode?{?get;?set;?}///?<summary>///?CaptchaMemoryStream///?</summary>public?MemoryStream?CaptchaMemoryStream?{?get;?set;?}///?<summary>///?Timestamp///?</summary>public?DateTime?Timestamp?{?get;?set;?} }接下來實現接口,主要是依賴微軟的System.Drawing.Common組件,注意命名空間的引用
using?System; using?System.Drawing; using?System.Drawing.Imaging; using?System.IO; using?System.Threading.Tasks;...public?class?Captcha?:?ICaptcha {private?const?string?Letters?=?"1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,V,W,X,Y,Z";public?Task<CaptchaResult>?GenerateCaptchaImageAsync(string?captchaCode,?int?width?=?0,?int?height?=?30){//驗證碼顏色集合Color[]?c?=?{?Color.Black,?Color.Red,?Color.DarkBlue,?Color.Green,?Color.Orange,?Color.Brown,?Color.DarkCyan,?Color.Purple?};//驗證碼字體集合string[]?fonts?=?{?"Verdana",?"Microsoft?Sans?Serif",?"Comic?Sans?MS",?"Arial"?};//定義圖像的大小,生成圖像的實例var?image?=?new?Bitmap(width?==?0???captchaCode.Length?*?25?:?width,?height);var?g?=?Graphics.FromImage(image);//背景設為白色g.Clear(Color.White);var?random?=?new?Random();for?(var?i?=?0;?i?<?100;?i++){var?x?=?random.Next(image.Width);var?y?=?random.Next(image.Height);g.DrawRectangle(new?Pen(Color.LightGray,?0),?x,?y,?1,?1);}//驗證碼繪制在g中for?(var?i?=?0;?i?<?captchaCode.Length;?i++){//隨機顏色索引值var?cindex?=?random.Next(c.Length);//隨機字體索引值var?findex?=?random.Next(fonts.Length);//字體var?f?=?new?Font(fonts[findex],?15,?FontStyle.Bold);//顏色??Brush?b?=?new?SolidBrush(c[cindex]);var?ii?=?4;if?((i?+?1)?%?2?==?0)ii?=?2;//繪制一個驗證字符??g.DrawString(captchaCode.Substring(i,?1),?f,?b,?17?+?(i?*?17),?ii);}var?ms?=?new?MemoryStream();image.Save(ms,?ImageFormat.Png);g.Dispose();image.Dispose();return?Task.FromResult(new?CaptchaResult{CaptchaCode?=?captchaCode,CaptchaMemoryStream?=?ms,Timestamp?=?DateTime.Now});}public?Task<string>?GenerateRandomCaptchaAsync(int?codeLength?=?4){var?array?=?Letters.Split(new[]?{?','?});var?random?=?new?Random();var?temp?=?-1;var?captcheCode?=?string.Empty;for?(int?i?=?0;?i?<?codeLength;?i++){if?(temp?!=?-1)random?=?new?Random(i?*?temp?*?unchecked((int)DateTime.Now.Ticks));var?index?=?random.Next(array.Length);if?(temp?!=?-1?&&?temp?==?index)return?GenerateRandomCaptchaAsync(codeLength);temp?=?index;captcheCode?+=?array[index];}return?Task.FromResult(captcheCode);} }在控制器中注入調用
using?Microsoft.AspNetCore.Mvc; using?System.Threading.Tasks;[Route("api/[controller]")] [ApiController] public?class?CaptchaController?:?ControllerBase {[HttpGet]public?async?Task<FileContentResult>?CaptchaAsync([FromServices]?ICaptcha?_captcha){var?code?=?await?_captcha.GenerateRandomCaptchaAsync();var?result?=?await?_captcha.GenerateCaptchaImageAsync(code);return?File(result.CaptchaMemoryStream.ToArray(),?"image/png");} }實際使用的時候,code就是本次生成的驗證碼,可以將其保存在session中,進行驗證,或者其它方式。
總結
以上是生活随笔為你收集整理的.NET Core 中生成验证码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET Core 中导入导出Excel
- 下一篇: ABP VNext实践之搭建可用于生产的