要完成一个简单的注册,登陆,至少需要实现Identity中的3个接口

IUser  
IUserStore<TUser> : IDisposable where TUser : IUser
IUserPasswordStore<TUser> : IUserStore<TUser>, IDisposable where TUser : IUser
其中IUser是实体,默认需要实现id和name两个属性
IUserStore是对User的crud,IUserPasswordStore是对密码的操作
在Identity中,密码不是必须的。
PS:目前没有深入了解为什么密码不是必须的,但是初步想来是因为要与oauth接口第三方平台提供的登陆,oauth的情况下本地可能是不存储密码的
 
public class TestUser:IUser
{
public TestUser()
{
Id = Guid.NewGuid().ToString();
}
public string Id { get; set; }
public string UserName { get; set; }
public string ElseProperty { get; set; }
public string Passwd { get; set; }
}
简单的实现一个IUser,这里我们还是要保存密码的
public class TestUesrStore:IUserStore<TestUser>,IUserPasswordStore<TestUser>

之后实现一个Store,同时实现上面的两个接口,具体的实现下面再详细说明

在Microsoft.AspNet.Identity.Core.dll中,提供了一个用于操作管理的类

public class UserManager<TUser> : IDisposable where TUser : IUser
其构造函数需要一个参数,类型为IUserStore<TUser>
public UserManager(IUserStore<TUser> store)
 
在controller中,我们可以实例化这个UserManager
UserManager = new UserManager<TestUser>(new TestUesrStore());
UserManager是一个private变量,来保存这个实例
 
之后我们使用UserManager来完成对应的功能
以注册为例:
UserManager本身有CreateAsync方法,而扩展方法有Create。不管是那种,都有2种重载
public virtual async Task<IdentityResult> CreateAsync(TUser user)
public virtual async Task<IdentityResult> CreateAsync(TUser user, string password)
一种是传密码的,一种是不传密码的。不论那种,最终会调用Store(IUserStore)的CreateAsync方法去持久化。区别在于传密码的还要调用IUserPasswordStore中的方法去处理密码相关的东西
下面是相对完整的代码
var user = new TestUser {
UserName=uname,
Passwd=passwd,
ElseProperty=elsepro
}; var result =await UserManager.CreateAsync(user, passwd); if (result.Succeeded)
{
return RedirectToAction("login");
}

登陆时,有2步

1.判断登陆名密码是不是正确

2.设置登陆(如cookie等)

var user = await UserManager.FindAsync(name, passwd);
判断user是不是null可知用户密码是否正确
 
如何设置cookie呢,从mvc5的示例中可以找到。与owin相关,这里不做详细说明。
 
 
下面具体说一下IUserStore和IUserPasswordStore的实现
 
所有的方法,返回都是Task,根据方法名基本可以猜到干什么,大都是读写库操作
你可以new Task返回,但是注意,在返回之前要调用task的Start方法来让task执行,否则会卡主
 
另外,还可以使用Task.FromResult来返回,可参考Microsoft.AspNet.Identity.EntityFramework.dll中UserStore的实现方法
 
public Task SetPasswordHashAsync(TestUser user, string passwordHash)

需要注意的是这个方法

这个方法是在注册的时候就会用到的,他的作用是把明文的密码设置成密文的密码,所以你只要设置user的密码属性为passwordHash即可,并不需要在这里进行持久化

var t= new Task(() =>
{
user.Passwd = passwordHash;
});
t.Start();
return t;
或者
user.Passwd = passwordHash;
return Task.FromResult<int>(0);

以上是一个简单的注册登陆使用Identity的实现

他和以前自己实现的思路基本是差不多的。

但是,从Identity的意义来说,对同一个人(IUser),他应该是有多种不同的登陆方式的

如:直接输入用户密码,使用QQ账号,使用微博账号等。

所以,我猜测Identity中的IUserLoginStore<TUser>就是干这个用的。

目前还没有更深入的研究

Microsoft.AspNet.Identity 的简单使用的更多相关文章

  1. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现

    Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...

  2. 从Microsoft.AspNet.Identity看微软推荐的一种MVC的分层架构

    Microsoft.AspNet.Identity简介 Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的mem ...

  3. 跟Microsoft.AspNet.Identity学习哈希加盐法

    什么是哈希加盐法? 废话少说:对于MD5这种加密算法,同样的密码每次加密后得到的密文是一样的,所以黑客可以利用已知的密码库(彩虹库)对目标数据库密文进行对比进行攻击. 怎样解决:哈希加盐法,以下是网上 ...

  4. Microsoft.AspNet.Identity 自定义使用现有的表—登录实现,aspnet.identity

    Microsoft.AspNet.Identity是微软新引入的一种membership框架,也是微软Owin标准的一个实现.Microsoft.AspNet.Identity.EntityFrame ...

  5. Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型

    这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...

  6. Microsoft.AspNet.Identity.EntityFramework/IdentityDbContext.cs

    using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema; ...

  7. MVC5中 在更新 Microsoft.Aspnet.Identity 后编译器错误

    环境:vs2013预览版chs,我试着创建vb.net web应用,从对话框中选择MVC和WebAPI.编译ok了.通过NuGet管理器更新了Microsoft.Aspnet.Identity.Cor ...

  8. Microsoft.AspNet.Identity: UserID用整型数据表示, 而不是GUID

    第一篇:  这个好像不太好 http://stackoverflow.com/questions/19553424/how-to-change-type-of-id-in-microsoft-aspn ...

  9. Microsoft.AspNet.Identity 重置密码

    重置密码:先生成重置密码的Token,然后调用ResetPassword方法重置密码,密码要符合规则.. ApplicationUserManager UserManager => _userM ...

随机推荐

  1. 为控件动态添加Style

    此文可解决:  重写控件时,给控件加入子控件或父控件的样式切换问题. 很灵活的可以根据不同内容显示不同样式 子控件作用在: <DataTemplate x:Key="ColmunHea ...

  2. 第二章 ConcurrentHashMap源码解析

    注:在看这篇文章之前,如果对HashMap的层不清楚的话,建议先去看看HashMap源码解析. http://www.cnblogs.com/java-zhao/p/5106189.html 1.对于 ...

  3. Day44 数据库的操作

    视图操作: 1.左连接查询 select * from person left join dept on person.dept_id = dept.did 2. 右连接 3. 内连接  inner ...

  4. python django 更改模型字段出错时的一个解决办法

    python/django 框架自带的 orm 无疑是django框架最拿得出手的一个亮点,orm无疑极大的方便了项目的开发,提高了开发的效率. 在实际的项目开发过程中,我们有时候需要修改模型的字段, ...

  5. jzoj5848

    小 S 热爱大自然, 一天他种了一棵奇怪的线段树. 奇怪的线段树是一种与普通线段树类似的结构, 唯一不同的是, 它不一定以每一个区间的中点作为分治中心. 麻烦的是, 小 S 的线段树被风吹散了, 散成 ...

  6. GPS欺骗(一)—无人机的劫持

    本文作者:唯念那抹瑞利蓝 今天我们所讲的是GPS欺骗的方式和简单的定义.让大家对GPS欺骗这个方面有所了解.GPS是全世界地一个卫星定位系统,由美国制造. 0×01 例子2011年伊朗劫持美国无人机 ...

  7. gulp-load-task 解决 gulpfile.js 过大的问题

    当我们在项目中使用gulp来实现前端自动化时,常常因任务太多导致gulpfile.js越来越臃肿,增加后期维护/变更成本.在计算机科学领域中,分治可以将我们的项目变得井然有序.所以,我们利用这个理念, ...

  8. 基于jeesite+android开发 电子商务系统免费教程

    下载地址: jeesite免费教程 基于jeesite+android开发 电子商务系统免费教程 基于jeesite+android开发 电子商务系统免费教程 这个教程已经录制完很久了,一直没有公开, ...

  9. 读/写锁的实现和应用(高并发状态下的map实现)

    程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁.在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源.但是如果有一个线程想去写这些共享资 ...

  10. Java并发编程实践读书笔记(4)任务取消和关闭

    任务的取消 中断传递原理 Java中没有抢占式中断,就是武力让线程直接中断. Java中的中断可以理解为就是一种简单的消息机制.某个线程可以向其他线程发送消息,告诉你“你应该中断了”.收到这条消息的线 ...