目录
效果

添加【VerificationController.cs】
/// <summary>
/// 验证码
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[AllowAnonymous] // 标记无需认证
public class VerificationController : ControllerBase
{
private readonly IMemoryCache _memoryCache;
public VerificationController(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 获取验证码
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult GetVerificationCode()
{
// 生成验证码文本(这里只生成一个简单的4位数字验证码)
var captchaText = GenerateRandomCaptcha(4);
// 存储验证码文本到缓存中,默认有效期为 5 分钟
_memoryCache.Set(captchaText, captchaText, new TimeSpan(0, 5, 0));
// 创建一个内存流来保存图片
using (var bitmap = new Bitmap(100, 40))
using (var graphics = Graphics.FromImage(bitmap))
{
graphics.Clear(Color.White);
graphics.DrawString(captchaText, new Font("Arial", 20), Brushes.Black, new PointF(10, 5));
// 将验证码图片保存到内存流
using (var ms = new MemoryStream())
{
bitmap.Save(ms, ImageFormat.Png);
ms.Seek(0, SeekOrigin.Begin);
return File(ms.ToArray(), "image/png");
}
}
}
/// <summary>
/// 校验验证码
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
[HttpPost]
public ActionResult ValidateCaptcha(string code)
{
if (string.IsNullOrEmpty(code))
{
return BadRequest("验证码不能为空");
}
// 从缓存中获取验证码文本
if (_memoryCache.TryGetValue(code, out var captchaValue))
{
// 校验验证码是否正确
if (captchaValue.ToString() == code)
{
return Ok("验证码正确");
}
else
{
return BadRequest("验证码错误");
}
}
return BadRequest("验证码错误");
}
/// <summary>
/// 获取随机码
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
private string GenerateRandomCaptcha(int length)
{
var random = new Random();
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return new string(Enumerable.Range(0, length)
.Select(_ => chars[random.Next(chars.Length)])
.ToArray());
}
}
添加内存缓存服务【Program.cs】

public class Program
{
public static void Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
// 添加内存缓存服务
builder.Services.AddMemoryCache();
builder.Services.AddSwaggerGen(
options =>
{
// 反射获取接口及方法描述
var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
//IncludeXmlComments 第二参数 true 则显示 控制器 注释
options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename), true);
//使用jwt
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "请在下方输入框子输入Bearer Token 开启JWT鉴权",
Name = "Authorization", // 默认名称,不能修改
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey,
Scheme = "Bearer"
});
//让swagger遵守jwt协议
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new List<string>()
}
});
});
#region 允许跨域
builder.Services.AddCors(options =>
{
options.AddPolicy("any", buffer =>
{
buffer.AllowAnyOrigin() // 允许任何来源主机访问
.AllowAnyMethod()
.AllowAnyHeader();
});
});
#endregion
builder.Services.Configure<FormOptions>(p =>
{
p.ValueLengthLimit = int.MaxValue;
p.MultipartBodyLengthLimit = int.MaxValue;
});
JwtData jwtData = new JwtData();
// 获取jwt数据
builder.Configuration.Bind("JWT", jwtData);
UtilJwt.JwtData = jwtData;
#region 添加jwt
//添加JWT身份验证服务
builder.Services.AddAuthentication(x =>
{
x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,//是否效验Issuer
ValidateAudience = true,//是否效验Audience
ValidateLifetime = true,//是否验证失效时间
ValidateIssuerSigningKey = true,//是否效验SigningKey
ValidAudience = UtilJwt.JwtData.Audience,
ValidIssuer = UtilJwt.JwtData.Issuer,
IssuerSigningKey = UtilJwt.GetSecurityKey(),
};
options.Events = new JwtBearerEvents()
{
OnMessageReceived = context =>
{
context.Token = context.Request.Query["access_token"];
return Task.CompletedTask;
}
};
});
#endregion
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
//1、先开启认证
app.UseAuthorization();
//2、再开启授权
app.UseAuthorization();
// 配置跨域 要在授权和鉴权后
app.UseCors("any");
app.MapControllers();
app.Run();
}
}



366

被折叠的 条评论
为什么被折叠?



