【Blog.Idp开源】支持在线密码找回

2023-11-05 22:58

本文主要是介绍【Blog.Idp开源】支持在线密码找回,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(一个做认证平台,必须会遇到的一个问题)

BCVP框架,是基于:

ASP.NETCore5.0+VUE.js+IdentityServer4等核心技术,实现的前后端分离与动态认证鉴权一体化平台。

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?userId=4045&code=CfDJ8HGMaC81CCVNj8gqKOrlZ5tFOx03UOdLeRYDQA8ktHq6cojFCMVS85P6iy0LkRa1GmeV9QzXbzwmowy1NQHPUBfKYBEVmP7BSleaPZCQv%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?userId=4045&code=CfDJ8HGMaC81CCVNj8gqKOrlZ5tFOx03UOdLeRYDQA8ktHq6cojFCMVS85P6iy0LkRa1GmeV9QzXbzwmowy1NQHPUBfKYBEVmP7BSleaPZCQv%2BQGVFCRhfPPvvlcMVDuKfpvJbbKE%2B8LsHjn%2Fkm2A%2F2BrMM%2FzuZfypjHqlMD%2F%2BgAHwWQqwx9Eq77%2BFpEauVUE7D1Fw%3D%3D&accessCode=60F15185E53181B775809F9B24B8C5AE

这样url就保证不会被篡改,那更新的只能是当前userId

// 防止篡改
var getAccessCode = MD5Helper.MD5Encrypt32(model.userId + model.Code);
if (getAccessCode != model.AccessCode)
{return RedirectToAction(nameof(AccessDenied), new { errorMsg = "随机码已被篡改!密码重置失败!" });
}

并且是当前userId的Email,不能是其他人的Email

var user = await _userManager.FindByEmailAsync(model.Email);
if (user == null)
{// Don't 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);

好啦,本次认证中心更新完成啦,不借助任何第三方来实现在线找回密码已经完成,如果对你有帮助点赞????哟。

如果有任何技术问题,欢迎下边留言吧????。

这篇关于【Blog.Idp开源】支持在线密码找回的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/353002

相关文章

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

电力系统中的A类在线监测装置—APView400

随着电力系统的日益复杂和人们对电能质量要求的提高,电能质量在线监测装置在电力系统中得到广泛应用。目前,市场上的在线监测装置主要分为A类和B类两种类型,A类和B类在线监测装置主要区别在于应用场景、技术参数、通讯协议和扩展性。选择时应根据实际需求和应用场景综合考虑,并定期维护和校准。电能质量在线监测装置是用于实时监测电力系统中的电能质量参数的设备。 APView400电能质量A类在线监测装置以其多核

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

JavaFX应用更新检测功能(在线自动更新方案)

JavaFX开发的桌面应用属于C端,一般来说需要版本检测和自动更新功能,这里记录一下一种版本检测和自动更新的方法。 1. 整体方案 JavaFX.应用版本检测、自动更新主要涉及一下步骤: 读取本地应用版本拉取远程版本并比较两个版本如果需要升级,那么拉取更新历史弹出升级控制窗口用户选择升级时,拉取升级包解压,重启应用用户选择忽略时,本地版本标志为忽略版本用户选择取消时,隐藏升级控制窗口 2.

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

HomeBank:开源免费的个人财务管理软件

在个人财务管理领域,找到一个既免费又开源的解决方案并非易事。HomeBank 正是这样一个项目,它不仅提供了强大的功能,还拥有一个活跃的社区,不断推动其发展和完善。 开源免费:HomeBank 是一个完全开源的项目,用户可以自由地使用、修改和分发。用户友好的界面:提供直观的图形用户界面,使得非技术用户也能轻松上手。数据导入支持:支持从 Quicken、Microsoft Money