个人网站收款问题,移动网站设计心得,网页设计语言,wordpress 4.7.5漏洞#xff08;一个做认证平台#xff0c;必须会遇到的一个问题#xff09;BCVP框架#xff0c;是基于:ASP.NETCore5.0VUE.jsIdentityServer4等核心技术#xff0c;实现的前后端分离与动态认证鉴权一体化平台。01密码找回认证中心绕不开的话题Architecture Design.无论你是自… 一个做认证平台必须会遇到的一个问题BCVP框架是基于:ASP.NETCore5.0VUE.jsIdentityServer4等核心技术实现的前后端分离与动态认证鉴权一体化平台。01密码找回认证中心绕不开的话题Architecture Design.无论你是自己做开源项目抑或是自己公司的项目只要是一套完整的、闭环的、成型的框架肯定会有授权认证那也就肯定会有用户模块登录部分必不可少那找回密码也是与之相生的影子——有登录肯定有找回。在BCVP框架中用到了IdentityServer4下文统称Ids4作为认证平台中心丰富的API为我们管理认证、客户端、用户、资源、令牌等复杂逻辑提供了可能。开源这么久了一直没有机会去处理密码找回这个需求官方当然也提供了各种扩展方法但是这些扩展都不是最重要的那找回密码什么是最重要的呢——答案就是服务器和客户端的通讯。常见的密码找回很简单要么发短信要么发邮件只有这样才能保证信息的安全和稳定性但是我毕竟没有这些额外的付费服务。当然还有其他的办法就是使用类似对接QQ、微信、GitHub、Google这种第三方认证平台做个二次登录来保证唯一性把密码找回转嫁到第三方平台上这种方案我个人感觉不太喜欢既然自己已经做认证平台了再对接一个认证平台总感觉怪怪的。所以平时就通过Github上提issue我手动做的密码重置就是文章开篇的那张图所示。但是这样毕竟不是长久之计肯定需要一种方案既可以不使用第三方的通讯工具更可以让用户自己来更新和找回密码我思考了下趁着周末在家没有很忙好好的思考了下采用密保问题的形式来让用户自己在线更新或找回密码。同时也更新一波代码让自己对代码和架构的感觉不要停下来。本文所涵盖的技术都很简单写的目的就是想顺着思路提供一种框架设计的思想。02新注册增加密保问题手动输入保证内容灵活可变Create a new account.还在之前的登录信息中增加了两个密码问题目前都是必填项。在源代码中因为用的ORM是EFCore相关的迁移已经做好了更新最新代码然后执行update-database即可当然直接更新你的数据库也可注意要指定上下文在用户表中添加从这一版本开始注册用户开始需要密保问题了之前的肯定没有所以之前的用户如果找密码就还是用之前的issue里给我留言吧当然我下一版本会增加修改个人信息的功能到时候之前没有设置密保的可以增加上密保问题为以后丢失密码做准备这也是一种框架设计方案。还这样注册完成后我们就可以尝试下找回密码好不好用PS: 这种方案以后目前超级管理员就暂时不能修改别人的密码了所以我先试水一段时间尽量让用户自己重置密码管理员还是不要轻易的重置用户密码了后期有需要也可以再加上。03忘记找回密码Forgot your password?首先在登录页面点击密码重置这里的重置包括两个场景1、未登录的找回2、登录状态的修改。然后填写邮箱和之前填写的密保问题考虑到之前的老用户是没有设置密保的所以这里是选填项如果点击提交会出现三种情况1、如果是管理员或者是登录状态可以更新操作2、如果未登录但是有密保问题也可以更新操作3、其他的返回错误登录输入自己邮箱或未登录输入正确密保答案(未登录也未输入密保问题)(未登录输入了密保但是该邮箱下密保不正确)如果邮箱和密保问题都正确那就可以得到更新密码的连接更新自己的密码。这样看起来我们已经完美的解决了重置密码的问题但是却不是这样的请继续往下看。04篡改他人的重置地址增加参数戳AccessCode.因为这个重置密码的链接每个人都能拿到拿到后手动更改其中的参数或者研究了规则也可以故意修改别人的邮箱比如知道了张三的uiserId和Email就可以更新他的密码了url是这样的https://ids.neters.club/account/reset-password?userId4045codeCfDJ8HGMaC81CCVNj8gqKOrlZ5tFOx03UOdLeRYDQA8ktHq6cojFCMVS85P6iy0LkRa1GmeV9QzXbzwmowy1NQHPUBfKYBEVmP7BSleaPZCQv%2BQGVFCRhfPPvvlcMVDuKfpvJbbKE%2B8LsHjn%2Fkm2A%2F2BrMM%2FzuZfypjHqlMD%2F%2BgAHwWQqwx9Eq77%2BFpEauVUE7D1Fw%3D%3D这种肯定是不行的所以需要对url进行加密防止篡改那我就又想了一下增加了一个随机参数accessCode把userId和Code进行md5加密就算知道userId和Email也无法知道code和accessCode。因为code是user对象转出来的而且这个code也是有一定的有效期的就比如下边这个链接的code是无效的那更别提重置密码了所以安全性是可以的。https://ids.neters.club/account/reset-password?userId4045codeCfDJ8HGMaC81CCVNj8gqKOrlZ5tFOx03UOdLeRYDQA8ktHq6cojFCMVS85P6iy0LkRa1GmeV9QzXbzwmowy1NQHPUBfKYBEVmP7BSleaPZCQv%2BQGVFCRhfPPvvlcMVDuKfpvJbbKE%2B8LsHjn%2Fkm2A%2F2BrMM%2FzuZfypjHqlMD%2F%2BgAHwWQqwx9Eq77%2BFpEauVUE7D1Fw%3D%3DaccessCode60F15185E53181B775809F9B24B8C5AE这样url就保证不会被篡改那更新的只能是当前userId// 防止篡改
var getAccessCode MD5Helper.MD5Encrypt32(model.userId model.Code);
if (getAccessCode ! model.AccessCode)
{return RedirectToAction(nameof(AccessDenied), new { errorMsg 随机码已被篡改密码重置失败 });
}
并且是当前userId的Email不能是其他人的Emailvar user await _userManager.FindByEmailAsync(model.Email);
if (user null)
{// Dont reveal that the user does not existreturn RedirectToAction(nameof(ResetPasswordConfirmation));
}
else
{if (user.Id.ToString() ! model.userId){return RedirectToAction(nameof(AccessDenied), new { errorMsg 不能修改他人邮箱密码重置失败 });}
}
05支持邮箱登录更多策略UserName Email.因很多小伙伴也反馈一个问题就是老是记不得自己的登录名倒是能记得自己的邮箱所以本次也正好更新下登录方式很简单_userManager.Users.FirstOrDefault(d (d.LoginName model.Username || d.Email model.Username) !d.tdIsDelete);
好啦本次认证中心更新完成啦不借助任何第三方来实现在线找回密码已经完成如果对你有帮助点赞????哟。如果有任何技术问题欢迎下边留言吧????。