用Abp实现两步验证(Two-Factor Authentication,2FA)登录(一):认证模块

Abp vNext实现登录返回token可调用其他接口 /必须加上项目和数据库里定义得授权范围,否则登录成功后还是提示401。只是验证登录,并不返回token。Abp中获取token的接口是。具体使用方式看官方文档的。部分,我就记录一些常用的。 阅读详情


在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系统支持两步验证功能。

两步验证,又称双重验证或双因素认证(Two-Factor Authentication,简称 2FA),本文称为“双因素认证”,它是使用两个或多个因素的任意组合来验证用户身份,例如用户提供密码后,还要提供短消息发送的验证码,以证明用户确实拥有该手机。

国内大多数网站在登录屏正常登录后,检查是否有必要进行二次验证,如果有必要则进入二阶段验证屏,如下图:

在这里插入图片描述

在这里插入图片描述

接下来就来实践这个小项目

本示例基于之前的博文内容,你需要登录并绑定正确的手机号,才能使用双因素认证。示例代码已经放在了GitHub上:Github:matoapp-samples

原理

双因素认证可以拆成两个阶段,第一阶段是普通的用户名+密码登录,一阶段验证是整个身份验证的基础,确保认证安全。整个认证流程如下

在这里插入图片描述

是否有必要开启双因素认证是由系统是否开启两步验证、用户是否启用两步验证以及是否通过免登录验证决定的,其中免登录验证将在后续文章中介绍。

查看Abp源码,Abp帮我们定义了几个Setting,用于配置双因素认证的相关功能。确保在数据库中将Abp.Zero.UserManagement.TwoFactorLogin.IsEnabled打开。

public static class TwoFactorLogin
{
    /// <summary>
    /// "Abp.Zero.UserManagement.TwoFactorLogin.IsEnabled".
    /// </summary>
    public const string IsEnabled = "Abp.Zero.UserManagement.TwoFactorLogin.IsEnabled";

    /// <summary>
    /// "Abp.Zero.UserManagement.TwoFactorLogin.IsEmailProviderEnabled".
    /// </summary>
    public const string IsEmailProviderEnabled = "Abp.Zero.UserManagement.TwoFactorLogin.IsEmailProviderEnabled";

    /// <summary>
    /// "Abp.Zero.UserManagement.TwoFactorLogin.IsSmsProviderEnabled".
    /// </summary>
    public const string IsSmsProviderEnabled = "Abp.Zero.UserManagement.TwoFactorLogin.IsSmsProviderEnabled";

...
}

在AbpUserManager的GetValidTwoFactorProvidersAsync方法中

Abp.Zero.UserManagement.TwoFactorLogin.IsSmsProviderEnabled开启后将添加“Phone”到Provider中,将启用短信验证方式。

Abp.Zero.UserManagement.TwoFactorLogin.IsEmailProviderEnabled开启后将添加“Email”到Provider中,将启用邮箱验证方式。

var isEmailProviderEnabled = await IsTrueAsync(
    AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsEmailProviderEnabled,
    user.TenantId
);

if (provider == "Email" && !isEmailProviderEnabled)
{
    continue;
}

var isSmsProviderEnabled = await IsTrueAsync(
    AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsSmsProviderEnabled,
    user.TenantId
);

if (provider == "Phone" && !isSmsProviderEnabled)
{
    continue;
}

在迁移中添加双因素认证的配置项

//双因素认证
AddSettingIfNotExists(AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsEnabled, "true", tenantId);
AddSettingIfNotExists(AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsSmsProviderEnabled, "true", tenantId);
AddSettingIfNotExists(AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsEmailProviderEnabled, "true", tenantId);

将默认User的IsTwoFactorEnabled字段设为true

public User()
{
    this.IsTwoFactorEnabled= true;
}

用户验证码校验模块

使用AbpBoilerplate.Sms作为短信服务库。

之前定义了DomainService接口,已经实现了验证码的发送、验证码校验、解绑手机号、绑定手机号

这4个功能,通过定义用途(purpose)字段以校验区分短信模板

public interface ICaptchaManager
{
    Task BindAsync(string token);
    Task UnbindAsync(string token);
    Task SendCaptchaAsync(long userId, string phoneNumber, string purpose);
    Task<bool> VerifyCaptchaAsync(string token, string purpose = "IDENTITY_VERIFICATION");
}

添加一个用于双因素认证的purpose,在CaptchaPurpose枚举类型中添加TWO_FACTOR_AUTHORIZATION

public const string TWO_FACTOR_AUTHORIZATION = "TWO_FACTOR_AUTHORIZATION";

在SMS服务商管理端后台申请一个短信模板,用于双因素认证。

在这里插入图片描述

打开短信验证码的领域服务类SmsCaptchaManager, 添加TWO_FACTOR_AUTHORIZATION对应短信模板的编号

public async Task SendCaptchaAsync(long userId, string phoneNumber, string purpose)
{
    var captcha = CommonHelper.GetRandomCaptchaNumber();
    var model = new SendSmsRequest();
    model.PhoneNumbers = new string[] { phoneNumber };
    model.SignName = "MatoApp";
    model.TemplateCode = purpose switch
    {
        CaptchaPurpose.BIND_PHONENUMBER => "SMS_255330989",
        CaptchaPurpose.UNBIND_PHONENUMBER => "SMS_255330923",
        CaptchaPurpose.LOGIN => "SMS_255330901",
        CaptchaPurpose.IDENTITY_VERIFICATION => "SMS_255330974"
        CaptchaPurpose.TWO_FACTOR_AUTHORIZATION => "SMS_1587660"    //添加双因素认证对应短信模板的编号
    };

    ...
}

双因素认证模块

创建双因素认证领域服务类TwoFactorAuthorizationManager。

创建方法IsTwoFactorAuthRequiredAsync,返回登录用户是否需要双因素认证,若未开启TwoFactorLogin.IsEnabled、用户未开启双因素认证,或没有添加验证提供者,则跳过双因素认证。

public async Task<bool> IsTwoFactorAuthRequiredAsync(AbpLoginResult<Tenant, User> loginResult)
{
    if (!await settingManager.GetSettingValueAsync<bool>(AbpZeroSettingNames.UserManagement.TwoFactorLogin.IsEnabled))
    {
        return false;
    }

    if (!loginResult.User.IsTwoFactorEnabled)
    {
        return false;
    }
    if ((await _userManager.GetValidTwoFactorProvidersAsync(loginResult.User)).Count <= 0)
    {
        return false;
    }
    return true;
}

创建TwoFactorAuthenticateAsync,此方法根据回传的provider和token值校验用户是否通过双因素认证。

public async Task TwoFactorAuthenticateAsync(User user, string token, string provider)
{
    if (provider == "Email")
    {
        var isValidate = await emailCaptchaManager.VerifyCaptchaAsync(token, CaptchaPurpose.TWO_FACTOR_AUTHORIZATION);
        if (!isValidate)
        {
            throw new UserFriendlyException("验证码错误");
        }
    }

    else if (provider == "Phone")
    {
        var isValidate = await smsCaptchaManager.VerifyCaptchaAsync(token, CaptchaPurpose.TWO_FACTOR_AUTHORIZATION);
        if (!isValidate)
        {
            throw new UserFriendlyException("验证码错误");
        }
    }
    else
    {
        throw new UserFriendlyException("验证码提供者错误");
    }

    
}

创建SendCaptchaAsync,此方用于发送验证码。

public async Task SendCaptchaAsync(long userId, string Provider)
{
    var user = await _userManager.FindByIdAsync(userId.ToString());
    if (user == null)
    {
        throw new UserFriendlyException("找不到用户");

    }

    if (Provider == "Email")
    {
        if (!user.IsEmailConfirmed)
        {
            throw new UserFriendlyException("未绑定邮箱");
        }
        await emailCaptchaManager.SendCaptchaAsync(user.Id, user.EmailAddress, CaptchaPurpose.TWO_FACTOR_AUTHORIZATION);
    }
    else if (Provider == "Phone")
    {
        if (!user.IsPhoneNumberConfirmed)
        {
            throw new UserFriendlyException("未绑定手机号");
        }
        await smsCaptchaManager.SendCaptchaAsync(user.Id, user.PhoneNumber, CaptchaPurpose.TWO_FACTOR_AUTHORIZATION);
    }
    else
    {
        throw new UserFriendlyException("验证提供者错误");
    }
}

改写登录

接下来将双因素认证逻辑添加到登录流程中。

在web.core项目中,
添加类SendTwoFactorAuthenticateCaptchaModel,发送验证码时将一阶段返回的userId和选择验证方式的provider传入

public class SendTwoFactorAuthenticateCaptchaModel
{
    [Range(1, long.MaxValue)]
    public long UserId { get; set; }

    [Required]
    public string Provider { get; set; }
}

将验证码Token,和验证码提供者Provider的定义添加到AuthenticateModel中

public string TwoFactorAuthenticationToken { get; set; }

public string TwoFactorAuthenticationProvider { get; set; }

将提供者列表TwoFactorAuthenticationProviders,和是否需要双因素认证RequiresTwoFactorAuthenticate的定义添加到AuthenticateResultModel中

public bool RequiresTwoFactorAuthenticate { get; set; }

public IList<string> TwoFactorAuthenticationProviders { get; set; }

打开TokenAuthController,注入UserManager和TwoFactorAuthorizationManager服务对象

添加终节点SendTwoFactorAuthenticateCaptcha,用于前端调用发送验证码

[HttpPost]
public async Task SendTwoFactorAuthenticateCaptcha([FromBody] SendTwoFactorAuthenticateCaptchaModel model)
{
    await twoFactorAuthorizationManager.SendCaptchaAsync(model.UserId, model.Provider);
}

改写Authenticate方法如下:

[HttpPost]
public async Task<AuthenticateResultModel> Authenticate([FromBody] AuthenticateModel model)
{
    //用户名密码校验
    var loginResult = await GetLoginResultAsync(
        model.UserNameOrEmailAddress,
        model.Password,
        GetTenancyNameOrNull()
    );

    await userManager.InitializeOptionsAsync(loginResult.Tenant?.Id);

    //判断是否需要双因素认证
    if (await twoFactorAuthorizationManager.IsTwoFactorAuthRequiredAsync(loginResult))
    {
        //判断是否一阶段
        if (string.IsNullOrEmpty(model.TwoFactorAuthenticationToken))
        {
            //一阶登录完成,返回结果,等待二阶段登录
            return new AuthenticateResultModel
            {
                RequiresTwoFactorAuthenticate = true,
                UserId = loginResult.User.Id,
                TwoFactorAuthenticationProviders = await userManager.GetValidTwoFactorProvidersAsync(loginResult.User),

            };
        }
        //二阶段,双因素认证校验
        else
        {
            await twoFactorAuthorizationManager.TwoFactorAuthenticateAsync(loginResult.User, model.TwoFactorAuthenticationToken, model.TwoFactorAuthenticationProvider);
        }
    }

    //二阶段完成,返回最终登录结果
    var accessToken = CreateAccessToken(CreateJwtClaims(loginResult.Identity));
    return new AuthenticateResultModel
    {
        AccessToken = accessToken,
        EncryptedAccessToken = GetEncryptedAccessToken(accessToken),
        ExpireInSeconds = (int)_configuration.Expiration.TotalSeconds,
        UserId = loginResult.User.Id,
    };
}

在这里插入图片描述

至此,双因素认证的后端逻辑已经完成。

项目地址

Github:matoapp-samples

双因子认证(Two-factor authentication)简介 双因子认证(,简称2FA)是一种身份验证机制,它要求用户提供两种不同类型的证据来证明自己的身份,通常包括用户所知道的(如密码)、用户所拥有的(如手机、安全令牌)或用户所特有的(如指纹、面部识别)。这种双层保护大大增强了账户的安全性,因为即使攻击者获取了用户的密码,没有第二个因素也无法登录。 阅读详情

相关推荐

Open UI5 源代码解析之1372:Controller.js

摘要 Controller.js 是 SAP OpenUI5 项目中一个关键的基础设施文件,位于 sap.ui.integration.editor.fields.fragment 路径下。该文件虽然代码量少,但承担着重要的桥梁作用: 作为 Fragment 型字段编辑器的默认控制器,负责将界面交互转换为统一的数据更新操作 采用控制反转(IoC)设计,通过 setField 方法接收外部注入的字段实例 提供 saveValue 方法实现核心业务逻辑:根据字段类型和翻译状态,将值写入正确的模型路径 与 Bas

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 967

Github的2FA验证问题的丝滑解决方案 ||(Verify your two-factor authentication (2FA) settings)

Github的2FA验证问题的丝滑解决方案 ||(Verify your two-factor authentication (2FA) settings)_哔哩哔哩_bilibili

To be a better man 4201

获取B站某用户更多的关注数和粉丝数

获取B站某用户更多的关注数和粉丝数 相关记录 一、 前言 B 站最多只能翻 5 页用户的关注数和粉丝数,如何能够看到更多呢。 方法我也是从网上翻来的,记载博客里,算是我研究过这个话题了。 二、需要的东西 关注数的 api https://api.bilibili.com/x/relation/followings?vmid=2884629&pn=1&ps=20&order=desc&jsonp=jsonp 关注者(粉丝)的 api https://api.bilibili.

Enderman_xiaohei的博客 4822

关于Github报错Verify your two-factor authentication (2FA) settings的解决方案

如果我们在使用GitHub出现2FA验证问题:Verify your two-factor authentication (2FA) settings,那么可以参考下面的解决方法解决问题。首先,去应用市场下载Anthenticator,然后打开Github的二维码:https://github.com/settings/security。当然,如果有国外的手机号直接使用验证码接收就可以,问题是不支持中国手机啊。那我们可以使用Authy来解决。然后,打开软件使用手机号进行登录,选择SMS,输入验证码即可。

xiangzhihong8的专栏 2986

CTF——流量分析题型整理总结

我见过的流量分析类型的题目总结: 一,ping 报文信息 (icmp协议) 二,上传/下载文件(蓝牙obex,http,难:文件的分段上传/下载) 三,sql注入攻击 四,访问特定的加密解密网站(md5,base64) 五,后台扫描+弱密码爆破+菜刀 六,usb流量分析 七,WiFi无线密码破解 八,根据一组流量包了解黑客的具体行为 例题: 一,ping 报文信息 (icm...

小锤队长的博客 5万+

Python爬取拼多多商品数据保姆级教程(附源码及效果图)

本文介绍了使用Python爬取拼多多商品数据的完整教程。通过DrissionPage库模拟浏览器操作,利用正则表达式提取嵌入在HTML中的商品数据(关键步骤是从window.rawData变量获取),解析后转换为结构化数据并导出Excel。教程包含八大步骤:环境配置、浏览器初始化、网络监听、搜索模拟、数据提取(核心是正则匹配JSON)、数据验证、字段解析和Excel导出,最后提供了封装好的函数可直接调用。该方法特别适合课程作业或毕业设计获取电商数据,能爬取商品名称、价格、销量等关键信息,处理了价格单位转换等

weixin_46449236的博客 2080

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(三):免登录验证

常用的实现方式是在用户登录成功后,生成一个随机的字符串Token,将此Token保存在用户浏览器的 cookie 中,同时将这个字符串保存在用户的数据库中。当用户再次访问时,如果 cookie 中的字符串和数据库中的字符串相同,则免登录验证通过。rememberClientToken是存储于cookie中的,当用户登出时不需要清空cookie中的rememberClientToken,以便下次登录跳过两步验证。为了安全,Token采用对称加密传输存储,同时参与校验的还有用户Id,以进一步验证数据一致性。

jevonsflash的专栏 2223

Tecplot进阶:巧用公式与多Frame对比,实现CFD多工况数据差异的可视化分析

本文详细介绍了如何利用Tecplot进行CFD多工况数据差异的可视化分析,通过公式计算和多Frame对比,实现变量差值自动计算、多视图同步展示和差异量化统计。文章还提供了数据准备、基础操作、实战技巧和常见问题解决方案,帮助工程师高效完成CFD后处理工作。

weixin_29227425的博客 530

用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发

前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读。首先添加全局对象:loginForm: 登录表单对象twoFactorData: 两步验证数据,showTwoFactorSuccess: 是否显示两步验证成功提示。

jevonsflash的专栏 6469

YOLOv11改进 | 融合改进篇 | 利用尺度统一检测头DynamicHead融合P2增加小目标检测层(让小目标无所遁形)

本文给大家带来的最新改进机制是针对性的改进,针对于小目标检测增加P2层针对于大目标检测增加P6层利用DynamicHead(原版本一比一复现,全网独一份,不同于网上魔改版本)进行检测,其中我们增加P2层其拥有更高的分辨率,这使得模型能够更好地捕捉到小尺寸目标的细节。我们增加P6层是一个较低分辨率但具有更大感受野的特征层。对于大尺寸目标,这意味着模型可以更有效地捕捉到整体的结构信息。在这些的基础上我们配合DynamicHead可以使模型根据不同尺寸的目标动态调整其检测策略,进一步提升模型的精度。

Snu77的博客 3955

Codex 实战 Skills:自动采集一天之内的 Git 提交,一键排版成精美工作日报并发送邮件

特性手动撰写脚本辅助(仅聚合)AI 增强自动化(本文方案)时间成本高(30-60分钟/天)中(5-10分钟/天)低(<1分钟/天)内容质量依赖个人总结能力原始数据堆砌,缺乏提炼专业、结构化、有业务视角信息完整性易遗漏完整,但难以阅读完整,且经过分类筛选维护成本无低中(需维护 Skill 配置)可扩展性低中高(可轻松添加周报、月报)适用场景所有开发者初级开发者追求效率的高级开发者本文详细介绍了一种基于 Codex Agent Skills 的自动日报生成方案。

yueyeguzhuo的专栏 102

关于Github登录的2FA authentication问题

可以直接看这个(使用edge浏览器即可):【Github的2FA验证问题的丝滑解决方案 ||(Verify your two-factor authentication (2FA) settings)】https://www.bilibili.com/video/BV1sj411e7wH?我一开始使用的configure是1Password(这里是edge的自带扩展),但是某天edge崩了,重新下载了一个,然后就没了,大半年来,我一直使用recovery codes进行登录,但是不是长久之计。

Carter_Yin的博客 1098

79、昇腾系列服务器/昇腾系列推理卡/昇腾系列嵌入式开发板+Dify+one api部署DeepSeek-R1-Distill-Qwen-32BW8A8+RAG本地模型知识库和负载均衡双实例

阶段,安装过程缺什么,,在docker外面git下源码,进入容器内部进行量化,这里的容器建议在创建个8卡的容器,双卡容器量化会显示npu显存不够,除非你用cpu转模型,我就懒得创建容器了,使用cpu量化吧,巨慢;创建容器,进入容器,计划使用两张昇腾NPU卡推理DeepSeek-R1-Distill-Qwen-32B的W8A8模型,所以构建的容器用两张卡,选6、7卡吧,0-6号卡可以跑文本嵌入模型、重排序模型;直接进入量化阶段,在容器外面操作即可,环境不用管,因为系统已经默认配置了环境,直接跳到。

sxj731533730 6121

GitHub 开启 2FA 双重身份验证的方法

如果您使用的 app 或浏览器插件不能使用摄像头扫描,可以点击 enter this secret 获取一串字符,并将这串字符输入到 app 或浏览器插件,这样也能生成 2FA 码。大意是,GitHub 用户现在需要启用 2FA 双因素身份验证作为附加的安全措施,您需要在2023年5月4日之前在您的帐户上启用双因素身份验证,否则将被限制进行帐户操作。由于破解第二个认证因子需要付出更多,并且其他类型的因子更难以窃取或伪造,因此 2FA 可提高帐户安全性,并更好地保护组织及其用户免遭未经授权的访问。

程序员「阿基米东」的编程之旅 6万+

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 45

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

新建一个项目,如何使用abp用户登录系统

1、首先参考Framework.Web里的packages.config,把相关的包都安装好。 2、App_Start文件夹下的xxxModule.cs和Startup.cs拷过来,修改下命名空间。 3、Controllers里的Result文件夹、ControllerBase.cs、AccountController.cs拷过来,修改下命名空间。 4、在需要登录才能访问的cont...

weixin_30627341的博客 1818

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Github的2FA验证(Two-factor authentication)(不要慌,非常简单)

Github的2FA验证(Two-factor authentication)(不要慌,非常简单)

YouAreLion的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

abp中多种登陆用户的设计

场景 在《学校管理系统》中,学生、家长、教师、教务都可能登陆,做一些属于他们自己的操作。这些用户需要的属性各不相同,比如学生有学号,而教师没有。 应用程序用户 在编码时,经常需要获取当前登陆用户的信息,这个当前登陆用户就是应用程序用户。asp.net提供了一整套方案来实现应用程序用户,包括身份验证、授权、asp.net identity等 应用程序用户与业务场景中的用户不同,应用程序用户只需要区别是谁,最简单情况只需要知道用户id,它不关心这个用户具体是教师还是学生或其它类型的用户。基于这个用户id还可以.

zhoumouren88的博客 1633

[Github实战]双重认证2FA 如何 设置/更改[手把手][2022]

github 双重认证2FA1.背景2.第一次设置2.1第一步点击Settings2.2点击Password and authentication2.3点击Enable two-factor authentication2.4点击Continue2.5点击enter this text code2.6 复制code2.7 下载一个软件authenticator totp2.8 打开totp软件-AddKey2.9 查看6位数字复制到github下(动态生成的,和steam的code一样)2.10 保存生成的

学生董格 9713

ABP后端的校验使用:FluentValidation

EF Core学习笔记:配置的方式 特性/Fluent API_董厂长的博客-优快云博客_efcore 特性前置笔记:EF Core学习笔记:CRUD_董厂长的博客-优快云博客两种配置方式 1.特性配置 2.Fluent Api第一种方式写在实体类中,比较耦合,最好使用第二种。.net内置数据校验机制,在项目代码中发现很多地方使用了特性校验。

dongnihao的博客 1068

Vue + Volo.Abp 实现OAuth2.0客户端授权模式认证

只需要清除vuex或Cookies中的token即可,可以调用vue-oidc-client的signOut,但只是跳转到配置的登出地址,不会清除token(前提是redirectAfterSignout为true,并设置了post_logout_redirect_uri)创建continue/index.vue,简单的显示登录成功的提示,常用的提示有“登录成功,正在为您继续”,“登录成功,正在为您跳转”等友好提示。(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。

jevonsflash的专栏 2521

双因素认证(2FA)

转自: http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html 所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 越来越多的地方,要求启用双因素认证(Two-factor authentication,简称 2FA)。本文介绍它的概念和实现方法。 一、双因素认证的概念 一般来说,三种不同类型的证据,可以证明一个人的身份。 秘密信息:只有该用户知.

走在搬砖的路上! 7528

【实用工具】Github的2FA(two-factor authentication)认证,github 双重认证2FA

一、开启2FA如果登录GitHub没有提示开启2FA,可以根据说明开启 GitHub开启2fa设置说明进入GitHub,点击右上角头像,弹出个人信息页面,选择【设置】 进入设置页面,侧边栏中选择【密码和身份验证】 下拉页面到“双…这样一来,即使有人知道了用户的用户名和密码,也无法直接登录到用户的账户,因为他们没有第二种验证方式。通过启用 2FA,用户可以增加其账户的安全性,因为即使用户名和密码泄露,也不会对账户的安全性造成太大威胁。点进去之后是这样的,用微信扫码是不行的!如果是我,会很珍惜!

BetrayFree的博客 1万+

Abp验证

用户输入的数据是否合法,需要验证通过后再提交到数据库。a'b'p提供了简单的操作。新增一个用户怎么让密码复杂一些呢?在core里,user的 实体上 覆盖原有特性 public class User : AbpUser&lt;User&gt; { public const string DefaultPassword = "123qwe"; [Requir...

qqqgg的专栏 1482

IOS用户github 2FA验证

使用github时可能会偶尔弹出以下页面要求进行2FA验证,提示“Verify your two-factor authentication (2FA) settings”。如果你是IOS用户,之前有下载GitHub app并进行了相关登陆设置,那么可以使用IOS自带的“密码”(password)软件作为这里的two-factor authenticator (TOTP) app。搜索github点开,里面的验证码就是前面需要输入的Authentication code。

m0_60340438的博客 748

github登录需要双因素认证(Two-factor authentication)

前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。作者:神的孩子都在歌唱。

智的博客 4513
上一篇: [MAUI 项目实战] 手势控制音乐播放器(四):圆形进度条
下一篇: [MAUI 项目实战] 手势控制音乐播放器(三): 动画
林晓lx
林晓lx 2017年优快云移动跨平台大赛优秀奖获得者 2017年优快云移动跨平台大赛优秀奖获得者
博客等级 码龄15年 3761粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林晓lx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值