博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Microsoft.AspNet.Identity 的简单使用
阅读量:6229 次
发布时间:2019-06-21

本文共 2609 字,大约阅读时间需要 8 分钟。

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

IUser
IUserStore
: IDisposable where TUser : IUser
IUserPasswordStore
: IUserStore
, 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
,IUserPasswordStore

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

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

public class UserManager
: IDisposable where TUser : IUser
其构造函数需要一个参数,类型为IUserStore
public UserManager(IUserStore
store)
 
在controller中,我们可以实例化这个UserManager
UserManager = new UserManager
(new TestUesrStore());
UserManager是一个private变量,来保存这个实例
 
之后我们使用UserManager来完成对应的功能
以注册为例:
UserManager本身有CreateAsync方法,而扩展方法有Create。不管是那种,都有2种重载
public virtual async Task
CreateAsync(TUser user)
public virtual async Task
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
(0);

 

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

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

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

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

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

 

目前还没有更深入的研究

转载于:https://www.cnblogs.com/czcz1024/p/3492527.html

你可能感兴趣的文章
【功能盘点】升级后的媒体处理MPS有哪些能力?
查看>>
【iOS 印象】Swift 中值类型与引用类型指北
查看>>
python-path配置问题解决
查看>>
创建使用 framework和 a静态库
查看>>
最好的Linux发行版
查看>>
利用AudioContext来实现网易云音乐的鲸鱼音效
查看>>
JS原型与原型链总结篇
查看>>
react学习笔记二----nodejs服务器搭建及异常处理
查看>>
开了香槟的Kubernetes并不打算放慢成功的脚步
查看>>
关于Mac 下 Charles的使用 以及碰到无法抓包的问题
查看>>
7月份前端资源分享
查看>>
搜狗手机助手联合腾讯御安全 共建APP安全生态环境
查看>>
Codeigniter 4.0-dev 版源码学习笔记之五——相对于 3.x 的变化
查看>>
(译 & 转载) 2016 JavaScript 后起之秀
查看>>
GB(一)
查看>>
方面和服务,差别大吗?
查看>>
Infor喜获中国智能制造与电商物流大奖
查看>>
瑞士科学家研发飞行夹克,用户可以像鸟一样任意飞翔
查看>>
互金启示录:流量思维的末路
查看>>
「镁客·请讲」镁伽机器人黄瑜清:有需求没供给,协作机器人市场存在“两极现象”...
查看>>