使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)

简介: 一个星期前,也就是3月20日,微软发布了Asp.Net Identity 2.0 RTM。功能更加强大,也更加稳定。Identity这个东西现在版本还比较低,每次发布新版本都会有较多改动。

一个星期前,也就是3月20日,微软发布了Asp.Net Identity 2.0 RTM。功能更加强大,也更加稳定。Identity这个东西现在版本还比较低,每次发布新版本都会有较多改动。


  2.0新增了很多功能,比如

  • “双重认证(TFA)" --就是类似密保登陆的功能
  • ”账号锁定”--可以设置账号在短时间内登陆失败达到一定次数则在几分钟内被禁止登陆
  • “账号认证”--即现在普遍的登陆模式,用户名即邮箱,注册后需要认证才可以登陆
  • “密码找回”--这个常用功能以前一直未被集成到Identity中
  • “单点登出(SSO)”--也就是同时打开了几个页面,在任何页面退出,都会导致其他页面的TOKEN失效,从而不能进行账户下的操作
  • “主键变更”--在1.0版本中用户表的主键是string类型的用户名,现在可以设置任意类型的主键,如int,Guid 等
  • “集合查询”-- 支持以集合的方式查询Users和Roles表
  • “删除账号”--现在这个功能可以使用UserManager管理类来实现,过去只能通过dbContext直接操作数据表是很麻烦的
  • “增强密码规则”--在注册时,可以设置密码规则,包括位数,是否必须大写字母,是否必须小写字母,是否必须数字,是否必须特殊符号等,规则更加强大


当然,上面的功能具体如何实现还需要我们来编写具体的代码,比如实现第三方登陆等,Identity只是给出了基本的脚手架。


  下面我基于Identity 2.0新的脚手架来实现他的 注册账号认证 功能,即使用邮箱注册后,系统发送邮件至用户邮箱,用户打开邮箱点击超链接激活账号后才可以登陆。


  首先,拿到新东西当然是看文档,然后下载Sample看下基本功能是如何实现的。


  官方给出的Sample的安装方法,使用VS 打开菜单 “工具”--》“NuGet程序包管理器"--》”程序包管理器控制台“,打开后输出”Install-Package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 –Pre“ 。然后程序会自动为你安装Sample程序,期间假如你的其他nuget包版本过低,或有重复的文件,会提示你更新等,你可能需要输入Y并按回车。另外需要注意的是:这个SAMPLE包需要安装在一个Empty的MVC项目中。


  2.0的脚手架内容和组织架构比以前更复杂,基本的内容您可以查看样板程序,此处不再赘述。下面仅讲解实现邮箱认证功能需要进行的改动。


  提示:此示例需要您对Identity有基本的了解,并配合Identity 2.0的Sample Code阅读效果更佳。


1.配置smtp服务


  要发送邮件给注册用户,首先我们需要有个发件邮箱,这里可以随便弄个QQ邮箱之类的。配置的内容可以直接写死在代码里,但为了方便配置,我们把它写到Web.Config中,


Web.Config

 

    上面的代码中,为了自定义配置节点,需要在configSections节点中,声明我们自定义的节点,这里我们自定义了一组节点叫application。然后我们就可以在下文中详细配置application节点组,其中的mail节点就是和smtp相关的邮箱配置。其中最主要的属性就是smtp服务器地址,端口号(一般默认25),和你的邮箱账号和密码。其他内容可以根据你的需要的策略自行配置。


  配置写好了,在程序中要使用时,只需读出其中的数据即可。我们需要将配置读到一个模型中,因此新建一个"Configurations"文件夹,并新建一个"MailConfig"类让它继承ConfigurationSection类,代码如下。


 MailConfig


在使用时,只需要MailConfig config = (MailConfig)ConfigurationManager.GetSection("application/mail"); 即可读取到配置属性,更详细的内容可以在ConfigurtaionSection上按F1参考MSDN。


2.配置UserManager


  在项目脚手架中,App_Start文件夹下有个IdentityConfig.cs文件,打开他,其中有一个继承了UserManager<ApplicationUser>的ApplicationUserManage类。(如果你没有变更文件结构的话,当然你可以根据需求自行调整整个文件组织结构)。


  在ApplicationUserManager中可以配置的东西很多,比如账号锁定规则,密码强度规则,密保登陆等。其中还有一句manager.EmailService = new EmailService();, 而这个EmailService类就在本文件中,他继承了IIdentityMessageService接口,这个接口总共只有一个方法SendAsync,也就是发送邮件,我们只需要在这个方法中实现发送邮件的逻辑,在需要发送邮件时UserManager会自动调用该方法。


MailService


上面这段代码简单的实现了邮件发送逻辑,当然也可以有更复杂的策略,比如是否使用SSL连接等此处我并未配置。关于电子邮件的相关知识可以参考:http://systemnetmail.com/

  

代码写到这里,运行程序,尝试注册新用户,如果邮箱配置没有问题的话,新用户应该已经可以收到系统发来的邮件了。不过现在即使未验证邮箱也可以登陆,需要自己实现未验证邮箱禁止登陆的功能。

 

3.变更Login策略


  首先说一下,在注册功能中,为了方便测试,注册后跳转的页面直接提供了激活邮箱的连接,正式运行的话需要把它删除,我们只需要把该连接发送到用户邮箱即可。


  在登陆时,统一调用的是SingInHelper中的PasswordSignIn方法,然后返回枚举类型的SignInStatus,来决定将哪个页面返回给用户。现在SignInStatus中并没有邮箱未验证禁止登陆的状态。因此我们要在其中加一个,比如叫”InvalidEmail"。如果返回的是SignInStatus.InvalidEmail,则让用户跳转到提示邮箱未激活的界面。也就是在Login方法中的switch语句中加一个case,如下图


Login


这里,我直接跳转到DisplayEmail页面,提示用户未激活邮箱,禁止登陆,并询问他是否需要再次发送验证邮件。当然这个页面我自己做了需要的修改。


  然后我们需要在PasswordSignIn方法中也加入相应的策略以使它能够返回InvalidEmail状态值。


PasswordSignIn


 在上面的代码中,未加邮箱验证前,用户登录后的逻辑顺序,1.判断是否存在该账号,2.判断该账号是否锁定,3.检测账号密码是否正确(若正确直接登陆,否则失败次数+1),4(若走到这一步则说明账号密码错误)检测是否需要锁定账号,5返回登陆失败。根据上面的逻辑,我们应该把邮箱验证加到2和3之间,也就是如上图代码中调用UserManager的IsEmailConfirmedAsync方法,来验证用户邮箱是否认证。


  至此,整个功能应该已经全部实现了。


此文是在我已经实现后第二天所写,若步骤有遗漏或错误,欢迎指正补充




相关文章
|
6月前
|
API 网络安全 数据安全/隐私保护
.NET邮箱API发送邮件的方法有哪些
本文介绍了.NET开发中使用邮箱API发送邮件的方法,包括SmtpClient类发送邮件、MailMessage类创建邮件消息、设置SmtpClient属性、同步/异步发送、错误处理、发送HTML格式邮件、带附件邮件以及多人邮件。AokSend提供高触达发信服务,适用于大规模验证码发送场景。了解这些技巧有助于开发者实现高效、可靠的邮件功能。
|
4天前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
|
3月前
|
存储 开发框架 安全
ASP.NET WebApi 如何使用 OAuth2.0 认证
ASP.NET WebApi 如何使用 OAuth2.0 认证
|
3月前
|
存储 开发框架 算法
ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路
|
3月前
|
开发框架 JSON .NET
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
ASP.NET Core 标识(Identity)框架系列(三):在 ASP.NET Core Web API 项目中使用标识(Identity)框架进行身份验证
|
3月前
|
存储 开发框架 JSON
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token
|
3月前
|
开发框架 .NET 数据库连接
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
ASP.NET Core 标识(Identity)框架系列(一):如何使用 ASP.NET Core 标识(Identity)框架创建用户和角色?
|
12月前
|
数据采集 自然语言处理 搜索推荐
.Net版本二维码生成器,可生成多种格式:WIFI、网址、邮箱等。
.Net版本二维码生成器,可生成多种格式:WIFI、网址、邮箱等。
93 0
|
开发框架 中间件 .NET
Asp.Net Core认证-Jwt-基础篇
Asp.Net Core认证-Jwt-基础篇
200 0
|
存储 SQL 开发框架
ASP.NET Core MVC 从入门到精通之Identity入门
ASP.NET Core MVC 从入门到精通之Identity入门
151 0