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 ...
随机推荐
- winform程序限制只能打开一个进程
有很多方案,先来最傻瓜式的 : static class Program { /// <summary> /// 应用程序的主入口点. ...
- 高并发系列之——MQ消息中间件Kafka
1.前言 1.1 包路径和源码 下载链接 基于发布订阅的分布式消息系统,使用scala语言编写. 特点:采用分区机制,每个分区可以放到不同的服务器上,提高了吞吐率,同时基于磁盘存储,以及副本机制可以确 ...
- 【Java】短信信息提取设计
问题产生:当有要求做信息有效性校验的时候,如何提取短信中有用的信息? 举个例子:有这样一条短信消息: [XXXXXX提醒]尊敬的客户,截止03月21日15:29,您本月套餐中包含手机上网国内流量累计1 ...
- web 开发人员必须学习的 3 门语言
web 开发人员必须学习的 3 门语言:html css js HTML 定义了网页的内容 CSS 描述了网页的布局 JavaScript 网页的行为
- [HttpException (0x80004005): 应用程序已预编译,因此不允许使用目录“/App_Code/”。]
删除网站下的PrecompiledApp.config文件即可.
- GIS 地理坐标分类
wgs84 GPS系统直接通过卫星定位获得的坐标.(最基础的坐标.) gcj02 兲朝已安全原因为由,要求在中国使用的地图产品使用的都必须是加密后的坐标.这套加密后的坐标就是gcj02 google的 ...
- How To Install Cacti On Ubuntu 14
How To Install Cacti On Ubuntu 14.04/14.10 by anismaj Cacti is an open source web based network moni ...
- apply方法和call方法的详解2
1.apply和call的区别在哪里 2.什么情况下用apply,什么情况下用call 3.apply的其他巧妙用法(一般在什么情况下可以使用apply) 我首先从网上查到关于apply和call的定 ...
- Mac系统操作指南
OSX 采用的Unix文件系统,所有文件都挂在跟目录“ /” 下面,所以不在要有Windows 下的盘符概念.比如什么“C:”你在桌面上看到的硬盘都挂在 /Volumes 下. 比如接上个叫做“XX” ...
- ISO14971-2007阅读
1.什么是风险? 风险的概念,公认的组成有两部分: 损害发生的概率 损害的后果,即损坏的严重性 2.风险管理的适用范围? 适用于医疗器械生命周期所有阶段 不适用于临床判断 不要求具体的质量体系,但14 ...