using Dpz.Core.Public.ViewModel.Response;
namespace Dpz.Core.Service.RepositoryService;
public interface IUserTwoFactorService
{
/// <summary>
/// 获取用户安全绑定状态,包括 2FA 与 Passkey 是否已绑定
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>用户安全绑定状态;账号无效或用户不存在时返回未绑定状态</returns>
Task<UserSecurityBindingStatusResponse> GetBindingStatusAsync(
string? account,
CancellationToken cancellationToken = default
);
/// <summary>
/// 开始 2FA 绑定流程,生成临时密钥和 setup token,并写入短期缓存
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>临时凭据;账号无效、用户不存在或已绑定 2FA 时返回 null</returns>
Task<UserTwoFactorSetupChallenge?> BeginSetupAsync(
string? account,
CancellationToken cancellationToken = default
);
/// <summary>
/// 获取已绑定 2FA 用户的密钥
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>已绑定密钥;账号无效、用户不存在、未绑定或密钥为空时返回 null</returns>
Task<string?> GetBoundKeyAsync(string? account, CancellationToken cancellationToken = default);
/// <summary>
/// 根据 setup token 读取 2FA 绑定流程中的临时密钥
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="setupToken">绑定流程开始时生成的 setup token</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>临时密钥;token 无效、过期或账号不匹配时返回 null</returns>
Task<string?> GetSetupKeyAsync(
string? account,
string? setupToken,
CancellationToken cancellationToken = default
);
/// <summary>
/// 使用 setup token 完成 2FA 绑定,并将临时密钥写入数据库
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="setupToken">绑定流程开始时生成的 setup token</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>异步任务</returns>
Task BindAsync(
string? account,
string? setupToken,
CancellationToken cancellationToken = default
);
/// <summary>
/// 解绑 2FA,并清除已保存的密钥
/// </summary>
/// <param name="account">用户账号</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>异步任务</returns>
Task UnbindAsync(string? account, CancellationToken cancellationToken = default);
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
代码说明
这是一个 用户双因素认证(2FA)服务接口的定义文件,属于仓储服务层。
接口概述
IUserTwoFactorService 定义了管理用户双因素认证(Two-Factor Authentication, 2FA)的核心功能,包括绑定、解绑、状态查询等操作。
方法详解
1. GetBindingStatusAsync
功能:查询用户的安全绑定状态
- 参数:
account:用户账号cancellationToken:用于取消异步操作的令牌
- 返回:
UserSecurityBindingStatusResponse- 包含 2FA 和 Passkey 的绑定状态 - 特殊处理:账号无效或用户不存在时返回未绑定状态
2. BeginSetupAsync
功能:启动 2FA 绑定流程
- 流程:
- 生成临时密钥(secret key)
- 生成 setup token(用于后续验证)
- 将数据写入短期缓存
- 返回:
UserTwoFactorSetupChallenge- 包含临时凭据信息 - 失败场景:账号无效、用户不存在或已绑定 2FA 时返回
null
3. GetBoundKeyAsync
功能:获取已绑定用户的 2FA 密钥
- 用途:用于验证用户输入的动态验证码
- 返回:已绑定的密钥字符串
- 失败场景:账号无效、用户不存在、未绑定或密钥为空时返回
null
4. GetSetupKeyAsync
功能:在绑定流程中获取临时密钥
- 参数:
setupToken:绑定流程开始时生成的令牌
- 用途:用于在绑定完成前验证用户输入的验证码
- 返回:临时密钥
- 失败场景:token 无效、过期或账号不匹配时返回
null
5. BindAsync
功能:完成 2FA 绑定
- 流程:
- 验证 setup token 有效性
- 从缓存中读取临时密钥
- 将密钥持久化到数据库
- 清除缓存中的临时数据
- 无返回值:操作成功/失败通过异常处理
6. UnbindAsync
功能:解除 2FA 绑定
- 操作:清除数据库中保存的密钥
- 无返回值
设计特点
- 异步模式:所有方法都是异步的,支持高并发场景
- 可空参数:
account和setupToken使用可空类型,提高容错性 - 取消令牌:支持操作取消,提升用户体验
- 分阶段绑定:使用临时密钥 + setup token 的两阶段验证机制,提高安全性
- 防御性设计:在多种异常情况下返回
null而非抛出异常
典型使用场景
用户绑定 2FA 流程:
1. 调用 GetBindingStatusAsync 检查是否已绑定
2. 调用 BeginSetupAsync 获取临时密钥和二维码
3. 用户扫描二维码后输入验证码
4. 调用 GetSetupKeyAsync 验证用户输入
5. 调用 BindAsync 完成绑定
AI 正在分析代码…
评论加载中...