一、什么是双重认证

所谓双重认证简单来说就是除了用户名密码方式外,还额外增加了一道登录屏障。登录时先输入用户名和密码,正确后会向邮箱或手机号发送一个验证码(取决于您采用何种方式,甚至可以采用银行的电子KEY啥的),输入的验证码如果正确的话,才可以登录系统。

二、AbpZero中使用双重认证特别需要注意的地方

1.发送的内容中没有验证码!

AbpZero项目中AbpUserManager类的RegisterTwoFactorProviders方法主要用于指定可用的验证信息发送提供程序,该方法中定义了发送信息的内容,信息内容从语言包中读取,可是在语言包中并没有该项!

AbpZero双重认证之短信的坑-LMLPHP

所以需要在语言包文件中Localization/XX/XX-zh-CN.xml中添加相应的语言项,需要注意的是语言项中的内容一定要添加占位符!不然发送的内容中是没有验证码的

AbpZero双重认证之短信的坑-LMLPHP

2.如何使用短信发送验证码?

1.后台需要开启双重认证,使用手机号验证这个就不说了

2.需要在项目中定义一个类来实现IIdentityMessageService接口,重写SendAsync方法来实现信息发送

    /// <summary>
/// 发送信息验证码
/// </summary>
public class IdentitySmsMessageService : IIdentityMessageService, ITransientDependency
{
public ILogger Logger { get; set; } private readonly ISmsSender _iSMSSender; public IdentitySmsMessageService(ISmsSender iSMSSender)
{
Logger = NullLogger.Instance;
_iSMSSender = iSMSSender;
} public async Task SendAsync(IdentityMessage message)
{
/*
//TODO: Implement this service to send SMS to users. This is used by UserManager (ASP.NET Identity) on two factor auth.
Logger.Warn("Sending SMS is not implemented! Message content:");
Logger.Warn("Destination : " + message.Destination);
Logger.Warn("Subject : " + message.Subject);
Logger.Warn("Body : " + message.Body);
*/
var msg = new SmsMessage();
msg.Mobile = message.Destination;
msg.Content = message.Body;
await _iSMSSender.SendAsync(msg);
}
}

3.账号必须要有手机号(PhoneNumber)且手机号是验证过的(IsPhoneNumberConfirmed),如果当前登录账号不满足这两个条件,则只能选择邮箱方式(因为邮箱在注册时是必须填写的),这个坑太深真的太深了。

AbpZero双重认证之短信的坑-LMLPHP

三、验证码和激活邮件有效期疑问

abpzero用户管理这块是基于identity framework实现的,查了很多资料,都没有看到验证码和激活邮件的过期时间,据说identity framework才会有这功能,不得不吐槽一下,太坑了。。。

04-18 19:46