要完成一个简单的注册,登陆,至少需要实现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>就是干这个用的。

目前还没有更深入的研究

最新文章

  1. Maven项目中的pom.xml详解【转】
  2. 在MyEclipse显示struts2源码和doc文档及自动完成功能
  3. UI基础:UIActionSheet和UIAlterView
  4. C# UserControl 判断DesignMode
  5. SGU 104
  6. 他们都没告诉你适配 Android N 需要注意什么
  7. myeclipse笔记(3):导入的项目切换jdk版本
  8. TCP/IP详解之:IP选路 动态选路协议
  9. java:字符串的“+”运算
  10. PAT (Advanced Level) 1059. Prime Factors (25)
  11. Mysql表锁、行锁、页锁
  12. hexo从零开始到搭建完整
  13. CSS3D 转换调试
  14. Java中多线程服务中遇到的Redis并发问题?
  15. MySQL8.0.15的安装与配置---win10
  16. Ubuntu下添加Samba用户名与密码
  17. 【原】在Matplotlib绘图中添加Latex风格公式
  18. Django中HtttpRequest请求
  19. 10-01 Java 类,抽象类,接口的综合小练习--运动员和教练
  20. dedecms在linux上安装提示没权限解决办法

热门文章

  1. Openlayers地图量算功能
  2. Windows Phone中解决多模块多程序集之间相互循环引用的问题一种思路
  3. ligerUI利用a标签下载文件
  4. vs installer 将.net framework 集成到安装包中
  5. Unity里vertexShader里压扁模型来实现比较low的阴影
  6. 【ZOJ2314】Reactor Cooling(有上下界的网络流)
  7. window10下Docker安装
  8. zoj2893 Evolution(矩阵快速幂)
  9. [Swift实际操作]七、常见概念-(3)尺寸CGSize的使用详解
  10. 《JAVA与模式》之模板方法模式