网站首页 网站源码
using System.Text;
using Dpz.Core.Auth.Models;
using Dpz.Core.Authenticator;
using Dpz.Core.Service.RepositoryService;
namespace Dpz.Core.Auth.Service;
public class PinCodeValidator(
IConfiguration configuration,
IUserTwoFactorService userTwoFactorService
) : IPinCodeValidator
{
public async Task<PinCodeValidatorModel> ValidateAsync(string? account, string pinCode)
{
if (configuration.GetValue("BypassTwoFactorIn", false))
{
return new PinCodeValidatorModel(true, null);
}
var (key, isBind) = await userTwoFactorService.GetKeyAsync(account);
if (!isBind)
{
return new PinCodeValidatorModel(false, "请先绑定双因素认证");
}
if (string.IsNullOrEmpty(pinCode))
{
return new PinCodeValidatorModel(false, "请输入PIN码");
}
var twoFactorAuthenticator = new TwoFactorAuthenticator();
var keyBuffer = Encoding.UTF8.GetBytes(key);
var keyBase32 = Base32Encoding.ToString(keyBuffer);
var twoFactorResult = twoFactorAuthenticator.ValidateTwoFactorPIN(keyBase32, pinCode, true);
return !twoFactorResult
? new PinCodeValidatorModel(false, "PIN码验证错误")
: new PinCodeValidatorModel(true, null);
}
public async Task<PinCodeValidatorModel> ValidateForAuthAsync(string? account, string? pinCode)
{
// 获取用户的2FA信息
var (key, isBind) = await userTwoFactorService.GetKeyAsync(account);
// 如果用户未绑定2FA,则跳过验证
if (!isBind)
{
return new PinCodeValidatorModel(true, null);
}
// 如果已绑定2FA但未提供PIN码,返回错误
if (string.IsNullOrWhiteSpace(pinCode))
{
return new PinCodeValidatorModel(false, "您已启用双因素验证,请输入验证码");
}
// 验证PIN码
var twoFactorAuthenticator = new TwoFactorAuthenticator();
var keyBuffer = Encoding.UTF8.GetBytes(key);
var keyBase32 = Base32Encoding.ToString(keyBuffer);
var twoFactorResult = twoFactorAuthenticator.ValidateTwoFactorPIN(keyBase32, pinCode, true);
return !twoFactorResult
? new PinCodeValidatorModel(false, "双因素验证码验证失败,请检查验证码是否正确")
: new PinCodeValidatorModel(true, null);
}
}
上述代码定义了一个名为 PinCodeValidator 的类,它实现了 IPinCodeValidator 接口,主要用于验证用户的双因素认证(2FA)PIN码。以下是代码的主要功能和结构的详细解释:
PinCodeValidator 类负责处理与双因素认证相关的 PIN 码验证逻辑。IConfiguration configuration 和 IUserTwoFactorService userTwoFactorService。IConfiguration 用于获取应用程序的配置设置,例如是否绕过双因素认证的设置。IUserTwoFactorService 是一个服务接口,用于获取用户的双因素认证密钥。ValidateAsync 方法:
account 字符串和一个 pinCode 字符串。userTwoFactorService.GetKeyAsync(account) 获取用户的双因素认证密钥和绑定状态。TwoFactorAuthenticator 类验证提供的 PIN 码是否有效。ValidateForAuthAsync 方法:
account 字符串和一个可选的 pinCode 字符串。PinCodeValidator 类的主要功能是处理用户的双因素认证 PIN 码的验证逻辑。它通过与配置和用户服务的交互,确保用户在需要时提供有效的 PIN 码,并根据用户的绑定状态和输入的有效性返回相应的结果。这种设计有助于增强应用程序的安全性,确保只有经过验证的用户才能访问敏感操作。
