编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

C# 实现短信验证码发送与 Redis 限制发送次数功能

wxchong 2024-08-07 01:27:09 开源技术 12 ℃ 0 评论

随着互联网的快速发展,短信验证码成为了用户注册、登录、找回密码等操作的重要验证手段。然而,为了防止恶意用户或机器人频繁发送验证码,造成资源浪费或系统压力,我们需要对短信验证码的发送次数进行限制。本文将介绍如何使用 C# 结合 Redis 来实现短信验证码的发送,并对发送次数进行限制。

一、准备工作

在开始之前,请确保你已经安装了以下工具和库:

  1. .NET Core SDK:用于开发 C# 应用程序。
  2. StackExchange.Redis:C# 操作 Redis 的客户端库。
  3. 一个可用的短信服务:例如 Twilio、阿里大于等,用于实际发送短信。

二、安装 StackExchange.Redis

你可以通过 NuGet 包管理器来安装 StackExchange.Redis。在命令行中运行以下命令:

dotnet add package StackExchange.Redis

或者在 Visual Studio 的 NuGet 包管理器中搜索并安装。

三、实现短信验证码发送

首先,你需要一个短信服务提供商的 API 来实际发送短信。这里以 Twilio 为例,但你可以根据需要替换为其他提供商。

  1. 配置 Twilio 账号和 Token

appsettings.json 中添加你的 Twilio 账号和 Token:

{
"Twilio": {
"AccountSid": "your_account_sid",
"AuthToken": "your_auth_token"
}
}
  1. 发送短信

创建一个 SmsService 类来封装短信发送的逻辑:

using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;
using Microsoft.Extensions.Configuration;
using System.Threading.Tasks;

public class SmsService
{
private readonly string _accountSid;
private readonly string _authToken;
private readonly TwilioRestClient _client;

public SmsService(IConfiguration configuration)
{
_accountSid = configuration["Twilio:AccountSid"];
_authToken = configuration["Twilio:AuthToken"];
_client = new TwilioRestClient(_accountSid, _authToken);
}

public async Task SendSmsAsync(string toPhoneNumber, string verificationCode)
{
var message = MessageResource.Create(
body: $"Your verification code is: {verificationCode}",
from: new PhoneNumber("+15017122661"), // 替换为你的 Twilio 电话号码
to: new PhoneNumber(toPhoneNumber)
);
await _client.ExecuteAsync(message);
}
}

四、使用 Redis 限制发送次数

为了防止滥用,我们将使用 Redis 来跟踪每个用户(或每个手机号)在特定时间段内发送验证码的次数。

  1. 配置 Redis 连接

appsettings.json 中添加 Redis 连接字符串:

{
"Redis": {
"ConnectionString": "localhost:6379" // 替换为你的 Redis 服务器地址和端口
},
// ... 其他配置 ...
}
  1. 创建 Redis 服务

创建一个 RedisService 类来封装 Redis 操作:

using StackExchange.Redis;
using Microsoft.Extensions.Configuration;
using System;
using System.Threading.Tasks;

public class RedisService
{
private static ConnectionMultiplexer redis;
private readonly string _connectionString;
private readonly IDatabase _db;

public RedisService(IConfiguration configuration)
{
_connectionString = configuration["Redis:ConnectionString"];
redis = ConnectionMultiplexer.Connect(_connectionString);
_db = redis.GetDatabase();
}

public async Task<long> IncrementAsync(string key)
{
return await _db.StringIncrementAsync(key);
}

public async Task<long> GetAsync(string key)
{
return await _db.StringGetAsync(key).ContinueWith(t => t.Result == RedisValue. ? 0 : Convert.ToInt64(t.Result));
}

// ... 其他 Redis 操作 ...
}
  1. 限制发送次数

在发送短信之前,先检查 Redis 中该手机号的发送次数:

public async Task<bool> TrySendSmsAsync(string phoneNumber, string verificationCode)
{
var key = $"sms:limit:{phoneNumber}"; // Redis 键名格式:sms:limit:{phoneNumber}
var count = await _redisService.GetAsync(key); // 获取当前发送次数
if (count >= 5) // 假设每小时最多发送 5 次验证码
{
return false; // 达到限制,不发送验证码
}
await _smsService.SendSmsAsync(phoneNumber, verificationCode); // 发送验证码
await _redisService.IncrementAsync(key); // 增加发送次数计数
// 可以设置 Redis 键的过期时间,例如 1 小时后过期,以便在 1 小时后重置计数。
// 这里为了简化示例,省略了设置过期的代码。你可以使用 _db.KeyExpireAsync(key, TimeSpan.FromHours(1)) 来设置。
return true; // 发送成功
}

五、总结与注意事项

本文介绍了如何使用 C# 结合 Redis 来实现短信验证码的发送,并对发送次数进行限制。在实际应用中,你可能还需要考虑以下几点:

  1. 错误处理:确保在发送短信和处理 Redis 数据时捕获并处理可能发生的异常。
  2. 安全性:保护你的 Twilio 和 Redis 凭据,避免将它们暴露在源代码或配置文件中。使用环境变量或安全的配置管理工具来存储这些敏感信息。
  3. 性能优化:在高并发场景下,你可能需要优化 Redis 和短信服务的性能。例如,使用 Redis 的管道化操作来减少网络往返时间,或使用短信服务的批量发送功能。
  4. 用户体验:确保在达到发送限制时向用户提供清晰的反馈,并告知他们何时可以再次尝试发送验证码。


Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表