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 ...
随机推荐
- java自学-编程入门
java语言写的代码需要先编译为可执行文件,才能被jvm执行.在下载的jdk安装目录下的bin目录,有两个可执行程序java.exe和javac.exe,javac就是用来编译的,java是执行编译后 ...
- golang 的md5加密
先看实现代码: package main import ( "crypto/md5" "encoding/hex" "fmt& ...
- 03.CSS选择器-->交集并集选择器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- php里单引和双引的用法区别和连接符(.)
" "双引号里面的字段会经过编译器解释,然后再当作HTML代码输出. ' '单引号里面的不进行解释,直接输出. 例如: $abc='my name is tome'; echo $ ...
- jQuery的attr()与prop()的区别
jQuery的attr()与prop()都是用于获取与设置属性的,但它们又各有不同. attr()一般是用于设置默认值,prop()一般是用于设置属性值,即对于像“diabled”,"che ...
- MyEclipse 2017/2018 安装与破解 图文教程
SSM 框架-02-MyEclipse 2017/2018 安装与破解 现在在学J2EE,然后使用的工具就是 MyEclipse,现在就抛弃 Eclipse 了,我就不多说它俩的区别了,但是 MyEc ...
- redis使用方式
关于Jedis连接Linux上的redis出现 DENIED Redis is running in protected mode问题的解决方案 1.修改redis.conf配置文件,将绑定的ip地址 ...
- MyBatis学习笔记(一)
测试Demo的目录结构: com.luohao.config ->MyBatisCongfig.xml ->userMapper.xml com.luohao.Test ->Test ...
- Mysql备份 -----innobackupex
一,原理及介绍〇 xtrabackup能做哪些 对InnoDB引擎的表做热备 增量备份 流压缩传输到另外的服务器上 在线移动表 更简单的创建从库 备份时不增加服务器 ...
- Gartner发布最新魔力象限报告,微软领跑数据库市场(编译自TechRepublic)
知名调研机构Gartner发布了最新的<2015年数据库管理系统魔力象限调研报告>.报告显示,微软.甲骨文和AWS是数据库市场的三大领导厂商. 此份报告对知名的商用以及开源数据库厂商进行了 ...