.NET Core实战项目之CMS 第十六章 用户登录及验证码功能实现

前面为了方便我们只是简单实现了基本业务功能的增删改查,但是登录功能还没有实现,而登录又是系统所必须的,得益于 ASP.NET Core的可扩展性因此我们很容易实现我们的登录功能。今天我将带着大家一起来实现下我们的ASP.NET Core2.2开发的CMS系统的登录及验证码功能。如果你觉得文中有任何不妥的地方还请留言或者加入DotNetCore实战千人交流群637326624跟大伙进行交流讨论吧!

本文已收录至《.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划》
作者:依乐祝
原文地址:https://www.cnblogs.com/yilezhu/p/10309647.html

写在前面

距离上一篇教程已经过去九天了,为什么这么久才更新呢?最近年终事情比较多,也比较忙,再加上上一篇文章的阅读量不高,也就没有更新的积极性了,所以更新有点滞后!好吧,我承认上面都是我的借口,其实我是想多整点干货来分享,也在思考怎么样的写作方式才更能被大伙所接收吧,所以今天才来更新。本文分两部分,第一部分是验证码的功能实现,第二部分是登录功能实现~

验证码功能实现

这里有人会说,验证码功能实现不是很简单嘛,有必要还单独开一个小节来说明嘛!其实我想说,验证码功能的实现的确很简单,但是如果要实现验证码功能的跨平台使用的话就稍微麻烦点了。好在我前几天看到了汪宇杰(微软MVP)的一篇关于验证码的文章,因此稍加修改在我们的CMS系统中进行了实现!昨天跟汪宇杰在聊的时候,听他说,他已经把这个验证码模块制作成了Nuget包,更方便大伙的使用,他的这个验证码模块的GitHub:https://github.com/EdiWang/Edi.Captcha.AspNetCore 有兴趣的可以看下源码。

验证码实现流程

我们知道一个简单的验证码的实现原理是生成一串随机字符(数字或字母),将字符串保存到Session中,同时生成一张图片用来显示在网页上。当用户提交内容到服务器的时,服务器检查用户输入的验证码是否与Session中的一致,以此判断验证码是否正确。流程如下图:

640?wx_fmt=png

实现流程

  1. 首先我们需要在项目的生成操作中,如下图所示:勾选-》“允许不安全代码”

    640?wx_fmt=png

  2. 由于我们需要使用 System.Drawing.Imaging 命名空间里的类型来生成图片,所以我们也需要安装一个NuGet包:

    Install-Package System.Drawing.Common -Version 4.5.1
  3. 上面的流程中你可以看到我们需要用到Session来进行验证码的存储,所以我们也需要在ASP.NET Core2.2中启用Session支持。在Startup.cs里加入:

     services.AddSession(options =>{options.IdleTimeout = TimeSpan.FromMinutes(15);options.Cookie.HttpOnly = true;});app.UseSession();

    上面的代码你应该能看懂吧,一个在ConfigureServices 中加入依赖,一个在Configure中开启中间件

    注意:Session依赖Cookie才能工作,所以请确保用户首先接受GDPR cookie策略,这是ASP.NET Core 2.1默认模板里添加的

  4. 具体的生成代码,我就不贴出来了,有兴趣的朋友可以下载我们的CMS系统的源码进行查看,我只贴出来怎么用,验证码的实现代码路径如下图所示:

    640?wx_fmt=png

  5. 由于我们后台系统只有登录页面需要用到这个验证码,因此我把这个生成验证码图片的操作放在了AccountController.cs控制器里面,代码如下所示:

    640?wx_fmt=png

    上图描述的很清晰了,所以这里我就不详细阐述了,上面包含了生成过程,session存储过程,返回图片的处理等等。

  6. 页面中加载图片,代码如下:

    640?wx_fmt=png

  7. 当然为了体现我们的专业性我们还需要实现点击图片刷新验证码的功能,如下图所示:

    640?wx_fmt=png

  8. 相应的我们要对验证码进行下验证,这里我们加入忽略大小写的验证规则:


    640?wx_fmt=png

登录功能实现

回想一下我们之前的登录实现过程,登陆成功后再把登录信息保存到Cookies或者Session里面,而在ASP.NET Core中我们知道,借助ASP.NET Core Identity 我们可以实现一个用于创建和维护用户登录的完整的,功能齐全的身份验证提供程序。当然,这里为了实现我们自己的登录逻辑,所以我们只使用基于基于cookie的身份验证,即将基于cookie的身份验证用作没有ASP.NET Core Identity的独立身份验证提供程序。

登录流程

登录流程如下图所示:

640?wx_fmt=png

这里的流程很简单,相信大伙扫一眼应该就能明白.

功能实现

这一小节我们就来一步一步的实现我们的登录功能吧,在开始之前呢,先看下我们的登录界面,如下图所示:

640?wx_fmt=png

  1. 由于我们这里用到了基于cookie的身份认证,所以如果应用程序没有使用Microsoft.AspNetCore.App元数据包,那么你需要再你的项目文件中添加Microsoft.AspNetCore.Authentication.Cookies Nuget包(版本2.1.0或更高版本

  2. ConfigureServices 方法中,通过添加AddAuthentication以及AddCookie方法来注入身份认证服务,代码如下:

    640?wx_fmt=png

  3. 当然你还得在Configure 中启用认证服务

    640?wx_fmt=png

  4. 接下来就是登录页面的加载代码如下:

    640?wx_fmt=png

    这里有一个returnUrl 用来返回退出前的页面,默认返回首页

  5. 这里页面js的判断流程的js代码我就不贴出来了,如果有兴趣你可以访问文章底部的Github上的源码进行查看

  6. 代码提交后我们要首先验证验证码是否有效,然后判断错误次数是否超了,然后再次对实体进行规则性验证,最后才进行登录的操作,具体的代码有点长,下面只贴出部分重要的代码

    判断验证码是否有效:

    640?wx_fmt=png

    判断错误次数是否超过规定的最大允许错误数:

    640?wx_fmt=png

    服务端对实体代码规则判断:

    640?wx_fmt=png

    登陆的具体代码:

    640?wx_fmt=png

    这里登录成功就进行登录次数,最后登录时间以及IP的记录,然后写入管理员操作日志中.
    最后所有验证通过后,直接调用HttpContext.SignInAsync 方法即可登录成功.这里我们在Claim中存放了很多我们后面需要用到的信息.

    640?wx_fmt=png

  7. 页面中处理返回结果,成功则调整到'ReturnUrl' 不成功则停留在登录页面.

    640?wx_fmt=png

  8. 好了,登录功能到现在就演示完成了,我们登录测试下,然后看一下吧!

    当没有输入验证码时:

    640?wx_fmt=png

    当验证码长度输入错误时:

    640?wx_fmt=png

    登陆成功时进入主界面!

  9. 当然我们我们还得实现下退出的功能哦!本来这里也想加入一些特殊的验证的,想想还是算了,就这样简单的实现下吧!

    640?wx_fmt=png

开源地址

这个系列教程的源码我会开放在GitHub以及码云上,有兴趣的朋友可以下载查看!觉得不错的欢迎Star
GitHub:https://github.com/yilezhu/Czar.Cms
码云:https://gitee.com/yilezhu/Czar.Cms
如果你觉得这个系列对您有所帮助的话,欢迎以各种方式进行赞助,当然给个Star支持下也是可以滴!另外一种最简单粗暴的方式就是下面这种直接关注我们的公众号了:

640?wx_fmt=png

总结

本文我带着你一步一步的实现了登录页面的功能,包括验证及登录的过程,认证和校验使用的时asp.net core中基于cookie的身份验证组件,希望对您有所帮助,下一节我们就根据登陆的信息来加载用户权限菜单以及权限功能的校验,再次感谢大家的阅读!

相关文章:

  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

  • .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

  • .NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

  • .NET Core实战项目之CMS 第四章 入门篇-Git的快速入门及实战演练

  • .NET Core实战项目之CMS 第五章 入门篇-Dapper的快速入门看这篇就够了

  • .NET Core实战项目之CMS 第六章 入门篇-Vue的快速入门及其使用

  • .NET Core实战项目之CMS 第七章 设计篇-用户权限极简设计全过程

  • .NET Core实战项目之CMS 第八章 设计篇-内容管理极简设计全过程

  • .NET Core实战项目之CMS 第九章 设计篇-白话架构设计

  • .NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

  • .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装GURD及仓储代码生成器实现

  • .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

  • .NET Core实战项目之CMS 第十四章 开发篇-防止跨站请求伪造(XSRF/CSRF)攻击处理

  • .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务

原文地址:https://www.cnblogs.com/yilezhu/p/10309647.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317583.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CF508D Tanya and Password(欧拉回路)

解析 之前模拟考过的一道题 把字符串当成前后缀之间的连边即可 注意即使图的度数符合要求&#xff0c;也可能由于不连通而无解&#xff0c;需要再特判一下 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int…

[HEOI2016/TJOI2016]字符串 (后缀数组+主席树+二分)

description 佳媛姐姐过生日的时候&#xff0c;她的小伙伴从某东上买了一个生日礼物。生日礼物放在一个神奇的箱子中。箱子外边写了一个长为 n 的字符串 s&#xff0c;和 m 个问题。佳媛姐姐必须正确回答这 m 个问题&#xff0c;才能打开箱子拿到礼物&#xff0c;升职加薪&…

[SDOI2014]旅行

[SDOI2014]旅行 题意&#xff1a; n个城市&#xff0c;n-1条边&#xff0c;任意两个城市互通&#xff0c;每个城市有所信奉的宗教和城市评级&#xff0c;有四种指令&#xff1a; 1.将城市x的居民改信为c教 2.将城市x的评级调整为w 3.统计x到y&#xff0c;路上所有的城市的评级…

YbtOJ-染色计划【树链剖分,线段树,tarjan】

正题 题目大意 给出nnn个点的一棵树&#xff0c;每个点有个颜色aia_iai​&#xff0c;你每次可以选择一个颜色全部变成另一个颜色。 求最少多少次操作可以把一种颜色变成一个完整的连通块。 1≤k≤n≤21051\leq k\leq n\leq 2\times 10^51≤k≤n≤2105 解题思路 考虑如果我们…

张高兴的 .NET Core IoT 入门指南:环境配置、Blink、部署

如何在 Raspberry Pi 的 Raspbian 上构建使用 GPIO 引脚的 IoT 程序&#xff1f;你可能会回答使用 C 或 Python 去访问 Raspberry Pi 的引脚。现在&#xff0c;C# 程序员可以使用 .NET Core 在 Raspbian(Linux) 上构建 IoT 应用程序。只需要引入 System.Device.GPIONuGet 包即可…

CF183C:Diverse Permutation(构造)

解析 首先考虑如何构造kn-1的情况 发现令排列为1,n,2,n-1…即可 那么在k不等于n-1时 只需要让前k项与上面的序列相同&#xff0c;后面公差为1即可 代码 #include<bits/stdc.h> using namespace std; #define ll long long #define ull unsigned long long const int N…

CF603E-Pastoral Oddities【CDQ分治,可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF603E 题目大意 开始时有nnn个点&#xff0c;没有边。 依次加入mmm条带权的边&#xff0c;每次加入后询问是否存在一个边集&#xff0c;满足每个点的度数均为奇数&#xff0c;求使得这个边集的最大权值最小。 1≤n≤105,1≤…

2020ICPC 江西省大学生程序设计竞赛

2020ICPC 江西省大学生程序设计竞赛

在AspNetMvc中使用日志面板. Logdashboard 1.1beta

Logdashboard是Net下的日志面板,它支持AspNet与AspNetCore项目。关于更多LogDashboard的介绍请看这里--使用logdashboard查看可视化日志。就在刚刚LogDashboard发布了1.1的beta版,在这个版本中有以下变化https://github.com/liangshiw/LogDashboard/releases支持NetFramework的…

【正睿2021寒假省选第二轮集训 day 1】令牌生成 (组合数+二分)

description solution 打表yyds 其实符合条件的个数跟nnn&#xff08;非题目中的意思&#xff09;有着等差数列公式的千丝万缕关系 所以可以二分出具体值 最后答案的取值范围一定是长成[,)[,)[,)&#xff0c;左闭右开的形式的 而且两个边界一定是只差了最小的那个111&#xff…

CF600F:Edge coloring of bipartite graph(二分图、构造)

解析 首先大胆猜结论&#xff1a;答案就是最大的点度数 考虑如何构造 设一个点联通的边的颜色集合为S&#xff0c;由题意得S中的元素不可重 假设新加入一条边(u,v) 设c1mex(Su),c2mex(Sv)c1mex(S_u),c2mex(S_v)c1mex(Su​),c2mex(Sv​) 如果c1等于c2&#xff0c;直接连就行了…

CF464E-The Classic Problem【最短路,主席树】

正题 题目链接:https://www.luogu.com.cn/problem/CF464E 题目大意 nnn个点mmm条边的一张无向图&#xff0c;第iii条边长度为2xi2^{x_i}2xi​&#xff0c;求sss到ttt的最短路。 1≤n≤105,0≤m,xi≤1051\leq n\leq 10^5,0\leq m,x_i\leq 10^51≤n≤105,0≤m,xi​≤105 解题思路…

.NETStandard FreeSql v0.0.9 功能预览

年关将至&#xff0c;首页技术含量文章真是越来越少&#xff0c;理解大家盼着放假过年&#xff0c;哥们我何尝不是&#xff0c;先给大家拜个早年。兄弟我从11月底发了神经&#xff0c;开启了 ORM 功能库的开发之旅&#xff0c;历时两个月编码和文档整理&#xff0c;目前预览版本…

【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)

description 点击查看题目 solution code 设dpi,jdp_{i,j}dpi,j​&#xff1a;把前iii个数划分jjj段的最小花费&#xff0c;wi,jw_{i,j}wi,j​&#xff1a;[i,j][i,j][i,j]划分为一段的花费 dpi,jmin(dp[k][j−1]w[k1][i])&#xff0c;k<idp_{i,j}min(dp[k][j-1]w[k1][i…

YbOJ-网格序列【拉格朗日插值】

正题 题目大意 有一个nmn\times mnm的网格&#xff0c;在上面填上[1,k][1,k][1,k]的数字&#xff0c;定义两个长度为nnn的序列ai,bia_i,b_iai​,bi​分别表示每一行/每一列的最大值。 求有多少种不同的合法a,ba,ba,b对。 1≤n,m≤106,1≤k≤1091\leq n,m\leq 10^6,1\leq k\le…

CF720C Homework(构造)(暴力)

解析 本题的关键是暴力与构造结合的思想 本题一排排往上填的想法不难得出&#xff0c;但是在列数较小的时候就会GG 所以考虑在n>5&#xff0c;m<5时&#xff0c;交换n&#xff0c;m&#xff0c;显然问题还是等价的 如果nm均小于5&#xff0c;就直接暴力dfs解决 在最后的…

第十二届蓝桥杯C++赛后感

文章目录A 空间卡片直线货物摆放路径时间显示G砝码称重H杨辉三角形双向排列J括号序列注&#xff1a;有些代码忘了考试时怎么写的了&#xff0c;&#xff08;我也懒得重新写&#xff09;&#xff0c;所以很多题的代码是acwing蓝桥杯讲解里的&#xff0c;我对其进行注释和修改A 空…

SeaweedFS在.net core下的实践方案

一直对分布式的文件储存系统很感兴趣&#xff0c;最开始关注淘宝的TFS&#xff08;Taobao File System&#xff09;&#xff0c;好像搁浅了&#xff0c;官方地址无法访问&#xff0c;github上面&#xff0c;各种编译问题&#xff0c;无意间发现了SeaweedFS链接seaweedfs测试了一…

[C++ STL algorithm] lower_bound、upper_bound、unique的本质

lower_bound&#xff1a;返回第一个大于等于查找值的地址upper_bound&#xff1a;返回第一个严格大于查找值的地址 使用这两个函数需要的头文件 #include <algorithm> using namespace std;要求数组必须是有序/单调的 lower_bound lower_bound( a 1, a n 1, x );意…

蓝桥杯 I.双向排序

题目链接 题解&#xff1a; 比赛时就直接写了一个暴力sort交上&#xff0c;能骗一点分是一点 昨晚看了acwing的讲解&#xff0c;现在结合我的思路更新正解 题目中设计两个操作&#xff0c;一个是选定前x个数&#xff0c;使其降序&#xff0c;另一个是选定后y个数&#xff0c…