MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等
本文体验在MVC中使用ASP.NET Identity 2.0,体验与用户身份安全有关的功能:
→install-package Microsoft.AspNet.Identity.Samples -Version 2.0.0-beta2 -Pre
安装后,在App_Start,Controllers, Models, Views等处都添加了多个文件。在App_Start/IdentityConfig.cs中有6个类和一个枚举:
● ApplicationUserManager:继承于泛型基类UserManager<ApplicationUser>, ApplicationUser用来处理用户的身份。
● ApplicationRoleManager
● EmailService
● SmsService
● ApplicationDbInitializer
● SignInHelper
● SignInStatus 枚举
□ Two-Factor Authentication机制
在ASP.NET Identity 2.0中,使用了"Two-Factor Authentication机制"来保证用户密码的安全,当用户密码可能存在不安全隐患的时候,系统会以短信或邮件的方式向用户发送安全码。
在ApplicationUserManager中的Create方法包含了验证用户名和密码以及发送安全码的逻辑:


PhoneNumberTokenProvider和EmailTokenProvider都继承于EmailTokenProvider,这个基类负责向用户发送短信或email。发送的前提是需要注册EmailService和SmsService,如下:

□ Account Lockout锁住帐号
当用户输错密码超过规定的次数,帐号就会被锁住。
在ApplicationUserManager中的Create方法也包含了锁住帐号的逻辑:

→在EmailService中编写发送右键的逻辑:
public class EmailService : IIdentityMessageService
{
public Task SendAsync(IdentityMessage message)
{
// Plug in your email service here to send an email.
//配置
var mailMessage = new System.Net.Mail.MailMessage("qdjjx9441@sina.com",
message.Destination,
message.Subject,
message.Body) //发送
SmtpClient client = new SmtpClient();
client.SendAsync(mailMessage, null); return Task.FromResult(0);
}
}
→在Web.config中的<configuration>节点下配置接收邮件的文件夹
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="F:\mailDrop"/>
</smtp>
</mailSettings>
</system.net>
→在Web.config中的<connectionStrings>节点配置连接字符串,用来把用户信息保存到数据库
<add name="DefaultConnection" connectionString=".;Initial Catalog=MVC_Identity-1-14;user id=sa;password=woshiniba;Integrated Security=SSPI"
providerName="System.Data.SqlClient" />
→AccontController中接收[HttpPost]的Register方法包含了用户注册后发送确认邮件的逻辑
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
var result = await UserManager.CreateAsync(user, model.Password);
if (result.Succeeded)
{
var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking this link: <a href=\"" + callbackUrl + "\">link</a>");
ViewBag.Link = callbackUrl;
return View("DisplayEmail");
}
AddErrors(result);
} // If we got this far, something failed, redisplay form
return View(model);
}
→运行项目 测试注册、确认邮件、登录
点击右上方的Register链接:

填写注册信息,点击注册:

注意:在Web.config中配置的mailDrop文件夹,需要创建,否则报错!
找到mailDrop文件夹,使用Foxmail打开后缀为eml的文件,看到:

点击链接地址:

点击"Click here to Log in"并登录:

→运行项目 测试账户锁定
修改App_Start/IdentityConfig.cs中, ApplicationUserManager类的相关部分为:
manager.UserLockoutEnabledByDefault = true;
manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(1);
manager.MaxFailedAccessAttemptsBeforeLockout = 2;
在App_Start/IdentityConfig.cs中,SignInHelper类的PasswordSignIn修改如下:
public async Task<SignInStatus> PasswordSignIn(string userName, string password, bool isPersistent, bool shouldLockout)
{
var user = await UserManager.FindByNameAsync(userName); //为测试帐号锁住而添加
await UserManager.IsLockedOutAsync(user.Id); //如果用户被锁住,这里返true
await UserManager.AccessFailedAsync(user.Id);//记录登录失败的次数,如果登录失败次数大于或等于设定的次数,在设置锁住时间内,用户账户被锁住
await UserManager.SetLockoutEnabledAsync(user.Id, true);//确认用户账户被锁住是否被启用 if (user == null)
{
return SignInStatus.Failure;
}
if (await UserManager.IsLockedOutAsync(user.Id))
{
return SignInStatus.LockedOut;
}
if (await UserManager.CheckPasswordAsync(user, password))
{
return await SignInOrTwoFactor(user, isPersistent);
}
if (shouldLockout)
{
// If lockout is requested, increment access failed count which might lock out the user
await UserManager.AccessFailedAsync(user.Id);
if (await UserManager.IsLockedOutAsync(user.Id))
{
return SignInStatus.LockedOut;
}
}
return SignInStatus.Failure;
}
再次登录,试着输入2次错误密码,出现提示帐号被锁住的界面:

当然还有一些其它功能,比如密码重置等。
参考资料:
Developing Secure ASP.NET MVC Applications using ASP.NET Identity 2.0
MVC使用ASP.NET Identity 2.0实现用户身份安全相关功能,比如通过短信或邮件发送安全码,账户锁定等的更多相关文章
- ASP.NET Identity V2
Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...
- ASP.NET Identity V2简单介绍
Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...
- asp.net identity 3.0.0 在MVC下的基本使用 序言
本人也尚在学习使用之中,错误之处请大家指正. 开发环境:vs2015 UP1 项目环境:asp.net 4.6.1 模板为:asp.net 5 模板 identity版本为:asp.n ...
- ASP.NET Identity 3.0教程
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:我相信有些人和我一样,已经开始把ASP.NET 5用于产品开发了.不过现在最大的问题是 ...
- Asp.Net Identity 2.0 认证
转Asp.Net Identity 2.0 认证 一个星期前,也就是3月20日,微软发布了Asp.Net Identity 2.0 RTM.功能更加强大,也更加稳定.Identity这个东西现在版本还 ...
- 使用Asp.Net Identity 2.0 认证邮箱激活账号(附DEMO)
注:本文系作者原创,但可随意转载.若有任何疑问或错误,欢迎与原作者交流,原文地址:http://www.cnblogs.com/lyosaki88/p/aspnet-itentity-ii-email ...
- CRMEB小程序商城v4.0二次开发对接集成阿里云短信
作者:廖飞 - CRMEB小程序商城研发项目组长 前言 cremb小程序商城v4.0版本支持短信平台为云信,但有部分用户有需求对接阿里云短信,这篇文章将对阿里云短信平台如何对接方以及对接流程详细说明. ...
- Asp.net Identity 2.0 作弊条
Moving ASP.NET Identity model to class library http://stackoverflow.com/questions/23446919/moving-as ...
- ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用(一)—修改数据库连接
开发环境:vs2017 版本:15.3.5 项目环境:.net framework 4.6.1 模板asp.net core 2.0 Web应用程序(模型视图控制器) 身份验证:个人用户账号 ...
随机推荐
- c++ 覆盖、重载与隐藏
成员函数被重载的特征:(1)相同的范围(在同一个类中):(2)函数名字相同:(3)参数不同:(4)virtual 关键字可有可无.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生 ...
- 抽象工厂模式 shiyanlou
二.什么是 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是一种软件开发设计模式.抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来.如果比较抽象工 ...
- hash 表 | | jzoj 1335 | | 脑残+手残 | | 集合的关系
给定两个集合A.B,集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5.我们希望求出A.B之间的关系. 给定两个集合的描述,判断它们满足下列关系的哪一种:A是B的一个 ...
- 几个开源XMPP Android客户端简单比较
想做个基于xmpp的即时通讯工具,服务端已经基本成型了.当然需要客户端需要配合,PC端基于spark进行改造,手机端先从Android入手(IOS估计一个人是搞不过来了). 原本Android开发 ...
- python学习之路-day12-mysql && orm
一.数据库 1.数据库介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储 ...
- 游标的使用之压缩数据库Log文件
declare @databasename nvarchar(100)--定义游标以及赋值 获取所有Online的Database Namedeclare getDataBaseCursor cur ...
- ChartServices Dev图形封装
.工具类ChartServices using System; using System.Data; using System.Drawing; using DevExpress.XtraCharts ...
- 20145316&20145229实验四:驱动程序设计
20145316&20145229实验四:驱动程序设计 结对伙伴:20145316 许心远 博客链接:http://www.cnblogs.com/xxy745214935/p/6130871 ...
- 完美解决全面屏蔽Google教程(终结者)
最近谷歌的IP被大范围的禁用了.身处一个连谷歌都用不了的过度的程序员,深感命运多舛.幸好,魔高一尺,道高一丈.下面是几种可以使用谷歌的方法. 方法一 1)在chrome浏览器中输入:chrome:// ...
- OpenVPN 通过服务器上网
在Windows环境中架设OpenVPN服务相对比较简单,网上这方面的教程也比较丰富,照葫芦画瓢即可.但是大部分教程都只讲了如何将client与Server通过VPN管道连接起来,使client可以正 ...