ASP.NET Core 双因素验证2FA 实战经验分享
必读
本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp
而是使用源码封装后面将会说明。
为了防止不提供原网址的转载,特在这里加上原文链接:
双因素认证
双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的认证。就像我们去银行办卡送的口令牌.
一. 前言
最近公司内部SSO登录一直在找一种安全的方式,目前已实现方案:账号密码登录以及手机验证码登录,通过Apollo切换不同的登录方式,想起18年看到AspNetCore.Totp并也编写了DemodotNetCore-2FA登录,将之前写的再完善并且在此记录和分析,希望对大家有些帮助。
二. AspNetCore.Totp
说明一下为什么要用AspNetCore.Totp
修改并且重新打包Brook.Totp
因AspNetCore.Totp
在生成二维码链接时会访问404(google.com)网站,国内基本无法使用,这很不清真,还有就是注入需要注入接口和实现类,使用起来很繁琐,所以才萌生了让使用起来更方便,并且不依赖Google生成二维码的想法
1.生成二维码
accountIdentity = accountIdentity.Replace(" ", "");var encodedSecretKey = Base32.Encode(accountSecretKey);var provisionUrl = UrlEncoder.Encode(string.Format("otpauth://totp/{0}?secret={1}&issuer={2}", accountIdentity, encodedSecretKey, UrlEncoder.Encode(issuer)));var protocol = useHttps ? "https" : "http";var url = $"{protocol}://chart.googleapis.com/chart?cht=qr&chs={qrCodeWidth}x{qrCodeHeight}&chl={provisionUrl}";var totpSetup = new TotpSetup{QrCodeImage = this.GetQrImage(url),ManualSetupKey = encodedSecretKey};
2.注入方式
Startup注入
services.AddSingleton<ITotpSetupGenerator, TotpSetupGenerator>();
services.AddSingleton<ITotpValidator, TotpValidator>();
services.AddSingleton<ITotpGenerator, TotpGenerator>();
Controller注入
private readonly ITotpGenerator _totpGenerator;private readonly ITotpSetupGenerator _totpSetupGenerator;private readonly ITotpValidator _totpValidator;public ValuesController(ITotpSetupGenerator totpSetupGenerator){_totpSetupGenerator = totpSetupGenerator;_totpGenerator = new TotpGenerator();_totpValidator = new TotpValidator(_totpGenerator);}
三. Brook.Totp
1.二维码使用QRCoder
来生成,不依赖外部网络
/// <summary>/// 生成二维码/// </summary>/// <param name="provisionUrl"></param>/// <param name="pixelsPerModule"></param>/// <returns></returns>private string GetQrBase64Imageg(string provisionUrl,int pixelsPerModule){QRCodeGenerator qrGenerator = new QRCodeGenerator();QRCodeData qrCodeData = qrGenerator.CreateQrCode(provisionUrl, QRCodeGenerator.ECCLevel.Q);Base64QRCode qrCode = new Base64QRCode(qrCodeData);string qrCodeImageAsBase64 = qrCode.GetGraphic(2);return $"data:image/png;base64,{qrCodeImageAsBase64}";}
2.注入方式
Startup注入
services.AddBrookTotp();
Controller注入
private readonly ITotp _totp;
public AccountController(ITotp totp)
{_totp = totp;
}
四.双因素APP
推荐使用Microsoft Authenticator支持IOS、安卓可自动备份
五. 完整流程效果图
使用Microsoft Authenticator
正常登录
登录成功后绑定,使用Microsoft Authenticator扫描二维码,然后输入显示的6位数字验证码
绑定后再次登录
六.如何使用
所有源代码请参照我的GitHub https://github.com/yuefengkai/Brook.Totp
EF Core In Memory Database
所有的数据只存在内存中Cache in-memory
dotNET Core Authentication
下方只展示部分代码
1.新建netCoreMVC项目添加Nuget包Brook.Totp
2.注入方式
Startup注入
services.AddMemoryCache();
services.AddSingleton<ICacheManage, CacheManage>();
services.AddBrookTotp();
services.AddDbContext<BrookTotpDBContext>(options => options.UseInMemoryDatabase(databaseName: "BrookTotpDB"));
Controller使用
private readonly ITotp _totp;
public AccountController(ITotp totp)
{_totp = totp;
}
//获取二维码
[Authorize]
public IActionResult GetQr()
{var totpSetup = _totp.GenerateUrl("dotNETBuild", CurremtUser.Email, CurremtUser.SecretKeyFor2FA);return Json(new { qrCodeContennt = totpSetup.QrCodeImageContent });
}
//验证双因素校验码
[Authorize]
[HttpPost]
public async Task<IActionResult> Valid(int code)
{var valid = _totp.Validate(CurremtUser.SecretKeyFor2FA, code, 30);if (!valid){return Json(new { result = 0, msg = "2FA校验失败" });}//校验成功后 如果是第一次绑定校验 需将用户的accountSecretKey 存入数据库CurremtUser.IsOpen2FA = true;await _userService.UpdateAsync(CurremtUser);_cacheManage.Remove(string.Format(CacheKeys.GetUserForEmail, CurremtUser.Email));var claims = new List<Claim>{new Claim("user", CurremtUser.Email),new Claim("role", "Member")};await HttpContext.SignInAsync(new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookies", "user", "role")));return Json(new { result = 1, msg = "2FA校验成功", url = "/Home/Index" });
}
七.写在最后
以上所有源代码已开源在 https://github.com/yuefengkai/Brook.Totp
作者:Brook
ASP.NET Core 双因素验证2FA 实战经验分享相关推荐
- 什么是双因素验证 2FA,如何用 Python 实现?
传统的用户名密码方式,容易泄漏,并不安全. 你说,加上短信验证码不就安全了,其实短信验证码也是不安全的,容易被拦截和伪造,SIM 卡也可以克隆,已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱 ...
- 看我如何绕过Lastpass双因素验证机制
本文讲的是看我如何绕过Lastpass双因素验证机制,在某次红队测试中,我发现了一种在Lastpass中绕过双因素验证(2FA)的方法.不幸的是,这一发现是在Tavis Ormandy曝光Lastpa ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第10章)-- 读书笔记
第 10 章 部署 10.1 部署到 IIS ASP.NET Core 应用程序支持部署到 IIS 中,之后它将作为应用程序的反向代理服务器和负载均衡器,向应用程序中转传入的 HTTP 请求 默认情况 ...
- ASP.NET CORE 微服务(简化版)实战系列-没有比这性价比再高的实战课程了
ASP.NET CORE 微服务(简化版)实战系列,最后1天298,现在注册购买再减50.作者jesse 腾飞在2.14 早上我买了他的课程后,他才做了下面这个活动: 作者jesse 腾飞花了大量的时 ...
- 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第1部分
目录 介绍 JWT(JSON Web令牌) ASP.NET Core中的JWToken配置 用户模型类 创建令牌 第1步 第2步 第4步 令牌存储 中间件 自定义中间件app.Use() 中间件app ...
- 自动化CodeReview - ASP.NET Core请求参数验证
自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...
- ASP.NET Core 技术内幕与项目实战读后感
前几天拿到了杨中科老师的新书<ASP.NET Core 技术内幕与项目实战>,迫不及待的"两"口气读完了.用一句话来总结,这是一本写给.NET开发者的非常实用的接地气的 ...
- Asp.Net Core WebApi 身份验证、注册、用户管理
Asp.Net Core WebApi身份验证.注册.用户管理 用户服务 用户实体.用户模型及数据上下文 应用程序设置文件 在Startup.cs中配置身份验证 参考文献 用了两天的时间研究了在Asp ...
- 52abp框架asp.net core Angular全栈开发实战视频课程
课程标题 52abp框架asp.net core & Angular全栈开发实战视频课程 课程简介 从零开始学 52ABP企业开发框架,企业项目是如何开发和技术选型,代码如何管理,团队协同开发 ...
最新文章
- QIIME 2用户文档. 12数据筛选Filtering data(2019.7)
- Exadata X2-2 vs EMC Greenplum DCA vs Netezza TwinFin 12主要配置大对比
- 2016蘑菇街编程题:搬圆桌
- 洛谷 P2853 [USACO06DEC]Cow Picnic S-dfs
- 用CSS3来代替JS实现交互
- LeetCode MySQL 1280. 学生们参加各科测试的次数
- html文件设置断点调试,断点调试
- 计算机应用基础课程整体设计说课视频,计算机应用基础说课稿
- springboot1.5.4 log4j
- syscall 系统调用陷入_MIPS中的异常处理和系统调用【转】-阿里云开发者社区
- OSI七层网络协议(应用层:http协议、传输层:TCP协议、网络层:IP协议,数据链路层:ARP协议、网络下一跳,物理层:比特流)
- golang接口与反射剖析
- VMware通过vmdk安装Kali linux
- python下雨动画特效_pygame实现烟雨蒙蒙下彩虹雨
- linux挖矿的清理工具,Linux挖矿病毒的清除与分析
- 研究生计算机方面有哪些专业,计算机类研究生有哪些专业?
- ubuntu 17.10安装64位Chrome浏览器
- 【python自动化】基于Splinter的自动化回归/测试脚本
- 修图软件哪个好android,修图软件哪个好?手机修图软件大盘点
- pytorch使用pytorch-kaldi实现ASR语音识别