Owin+ASP.NET Identity浅析系列(一)用户登录注册
在今天,读书有时是件“麻烦”事。它需要你付出时间,付出精力,还要付出一份心境。--仅以《Owin+ASP.NET Identity浅析系列》来祭奠那逝去的……
使用VS2015创建MVC项目运行之后,发现微软很贴心的生成了一套用户授权验证系统,界面也很漂亮,但是扒拉代码一看,囧……新的membership框架,真是太给力了,连数据库表都给你生成了(EF的功劳),问题是,你这一堆一堆的代码,虽然看着很吊(也
确实很吊),但是看着人头大呢,只好研究研究,研究过程记录一下,希望可以帮到那些看到这堆代码之后也头皮发麻的小伙伴们!!!
第一步:删除这一堆代码
微软折腾了一堆代码,说实话对微软的各种viewmodel验证不感冒,所以我要删除它,重新来过!喜欢使用的童鞋,可以保留
备注:亲,别全部删完,请保留IdentityModels类,修改下命名空间,并将其移入App_Start目录中

第二步:拉出自动生成数据表的sql语句(因为后面使用的是mysql数据库,而且引擎还不是innodb)
create table aspnetusers
(
Id char(32) primary key,
Email varchar(50) null comment '用户邮箱',
EmailConfirmed bit not null comment '是否认证邮箱',
PasswordHash varchar(100) null comment '账户密码',
SecurityStamp varchar(100) null comment '防伪印章',
PhoneNumber varchar(100) null comment '用户手机',
PhoneNumberConfirmed bit not null comment '是否认证手机',
TwoFactorEnabled bit not null comment '是否启用双重身份验证',
LockoutEndDateUtc datetime null comment '锁定结束时间',
LockoutEnabled bit not null comment '是否启用锁定',
AccessFailedCount int not null comment '登陆失败次数',
UserName varchar(50) not null comment '用户名称'
) comment '用户表'; create table aspnetuserclaims
(
Id int auto_increment primary key,
UserId char(32) not null comment '用户Id',
ClaimType varchar(100) null comment 'ClaimType',
ClaimValue varchar(100) null comment 'ClaimValue'
) comment 'claims表'; create table aspnetuserlogins
(
UserId char(32) not null comment '',
ProviderKey varchar(100) not null comment '',
LoginProvider varchar(100) not null comment ''
) comment '登陆日志表'; create table aspnetuserroles
(
UserId char(32) not null comment '',
RoleId char(32) not null comment ''
) comment '用户角色表'; create table aspnetroles
(
Id char(32) primary key,
Name varchar(50) not null comment ''
) comment '用户角色表';
第三步:修改ID的默认赋值,默认是36为GUID,修改为32位
public class ApplicationUser : IdentityUser
{
public ApplicationUser()
{
this.Id = System.Guid.NewGuid().ToString("N");
} public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// 请注意,authenticationType 必须与 CookieAuthenticationOptions.AuthenticationType 中定义的相应项匹配
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// 在此处添加自定义用户声明
return userIdentity;
}
}
第四步:用户登录,两套代码(一套是默认的登录方式,一套是自定义登录方式)
默认登录方式代码如下:
[HttpPost]
public async Task<ActionResult> Login(string account, string password)
{
// 1. 利用ASP.NET Identity获取用户对象
var user = await UserManager.FindAsync(account, password); if (user == null)
return Json(new { Flag = false, Content = "用户名或密码错误!!!" }); // 2. 利用ASP.NET Identity获取identity 对象
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); // 3. 将上面拿到的identity对象登录
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity); return Json(new { Flag = true, Content = "登录成功!!!" });
}
自定义登录方式代码如下:
[HttpPost]
public async Task<ActionResult> Login(string account, string password)
{
// 1. 利用ASP.NET Identity获取用户对象
var user = await UserManager.FindAsync(account, password); if (user == null)
return Json(new { Flag = false, Content = "用户名或密码错误!!!" }); // 验证用户密码和登录密码是否一致,FindEmail等方法使用
// UserManager.PasswordHasher.VerifyHashedPassword(user.PasswordHash, password); // 2. 利用ASP.NET Identity获取identity 对象
var claims = new List<System.Security.Claims.Claim>(); claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.NameIdentifier, user.Id));
claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Name, user.UserName));
claims.Add(new System.Security.Claims.Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity"));
claims.Add(new System.Security.Claims.Claim("AspNet.Identity.SecurityStamp", user.SecurityStamp)); // 这里可以自定义角色或其他数据
// claims.Add(new System.Security.Claims.Claim(System.Security.Claims.ClaimTypes.Role, "user")); //声明身份验证方式
var identity = new System.Security.Claims.ClaimsIdentity("ApplicationCookie"); identity.AddClaims(claims); // 3. 将上面拿到的identity对象登录
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity); return Json(new { Flag = true, Content = "登录成功!!!" });
}
第五步:用户注册,两套代码(一套是默认的注册方式,一套是自定义注册方式)
默认注册方式代码如下:
[HttpPost]
public async Task<ActionResult> Register(Models.RegisterViewModel model)
{
var user = new ApplicationUser { UserName = model.UserName, Email = model.Email }; var result = await UserManager.CreateAsync(user, model.Password); if (result.Succeeded)
{
return Json(new { Flag = true, Content = "注册成功!!!" }, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new { Flag = false, Content = "注册失败!!!" }, JsonRequestBehavior.AllowGet);
}
}
自定义注册方式代码如下:
[HttpPost]
public async Task<ActionResult> Register(Models.RegisterViewModel model)
{
var db = new Data.DataContext(); db.Members.Add(new Data.DomainModels.Member()
{
Id = Guid.NewGuid().ToString("N"),
SecurityStamp = Guid.NewGuid().ToString(),
Email = model.Email,
PasswordHash = UserManager.PasswordHasher.HashPassword(model.Password),
UserName = model.UserName
}); var result = await db.SaveChangesAsync(); if (result > 0)
{
return Json(new { Flag = true, Content = "注册成功!!!" }, JsonRequestBehavior.AllowGet);
}
else
{
return Json(new { Flag = false, Content = "注册失败!!!" }, JsonRequestBehavior.AllowGet);
} }
好了,到这里我们就已经完成了后台的登录注册功能,把代码抽离之后,再看是不是很简单的样子,跟以前的forms认证代码结构差不多啦,封装封装用起来就更方便了!
Owin+ASP.NET Identity浅析系列(一)用户登录注册的更多相关文章
- Owin+ASP.NET Identity浅析系列(四)实现用户角色
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 通过Owin+ASP.NET ...
- Owin+ASP.NET Identity浅析系列(二)扩展用户属性
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 上一篇博客讲了用户登录注册问 ...
- Owin+ASP.NET Identity浅析系列(五)接入第三方登录
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… OK,用户角色实现后,我们回 ...
- Owin+ASP.NET Identity浅析系列(三)框架结构分析
在今天,读书有时是件“麻烦”事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的…… 前两篇博客仅仅说了下功能如何 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(15)-用户登录详细错误和权限数据库模型设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
- Asp.NET WebApi+Redis实现单用户登录实战演练
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- 从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程
从零开始实现asp.net MVC4框架网站的用户登录以及权限验证模块 详细教程 用户登录与权限验证是网站不可缺少的一部分功能,asp.net MVC4框架内置了用于实现该功能的类库,只需要简单搭 ...
- android安卓Sqlite数据库实现用户登录注册
看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...
- javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册
一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...
随机推荐
- 【SSH网上商城项目实战11】查询和删除商品功能的实现
转自:https://blog.csdn.net/eson_15/article/details/51360804 在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做 ...
- 判定 java 对象死亡的过程
- RFC1939 POP3协议 中文版 (转载)
1.简介 对于在网络上的比较小的结点,支持消息传输系统(MTS)是不实际的.例如,一台工作站可能不具有充足的资源允许SMTP服务器和相当的本地邮件传送系统保持序驻留,并持续运行.同样的,将一台个人 ...
- 简单工厂模式使用ResourceBundle读取.properties配置文件
在做项目时,遇到需要创建DAO.Service等类的实例的时候,想到用工厂方法来运作,而简单工厂方法又有明显的缺点: ①由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中 ...
- 13 Reasons Why You Should Pay Attention to Mobile Web Performance
Mobile is no longer on the sidelines. If you’re not already thinking mobile first, you should at lea ...
- Uncaught TypeError: _react2.default.createContext is not a function
question is caused by react version, update your react version, it will be ok. use "npm update ...
- 【源代码R3】移植一份LARGE_INTEGER转时间的代码
本代码来自ReactOS-0.4.0\lib\rtl\time.c中的函数RtlTimeToTimeFields(IN PLARGE_INTEGER Time, OUT PTIME_FIELDS Ti ...
- c# 序列化接口(转载贴)
http://www.cnblogs.com/TianFang/p/3724449.html
- 移动端App开发 - 01 - 开篇
移动端App开发 - 01 - 开篇 从此笔记之后开启移动端 app 开发学习 该系列笔记去掉所有无关重要的东西,简介干练 我的移动端App开发笔记 1.移动端App开发 - 02 - iPhone/ ...
- IOC和AOP的个人理解
IOC,依赖倒置的意思,所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B. 所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B, ...