要完成一个简单的注册,登陆,至少需要实现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. [ASP.NET]Net Framework环境问题的一种修复方案

    一.情况介绍 造价软件基于.net framework 4.0开发,要成功运行需要在目标电脑上安装4.0版本以上的framework.一般情况下xp是没有的,win7系列自带3.5,都需要手动安装4. ...

  2. .Net中XML,JSON的几种处理方式

    一.XML: 1.基本了解: xml,Extensible markup language可扩展标记语言,用于数据的传输或保存,特点,格式非常整齐数据清晰明了,并且任何语言都内置了xml分析引擎, 不 ...

  3. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  4. SQL Server2008 R2 数据库镜像实施手册(双机)

    一.配置主备机 1. 服务器基本信息 主机名称为:HOST_A,IP地址为:192.168.1.155 备机名称为:HOST_B,IP地址为:192.168.1.156 二.主备实例互通 实现互通可以 ...

  5. SPOJ Longest Common Substring II

    题目连接:戳我 题目大意:求n个字符串的最长公共子串. 它的简化版--这里 当然我们可以用SA写qwq,也可以用广义SAM写qwq 这里介绍纯SAM的写法...就是对其中一个建立后缀自动机,然后剩下的 ...

  6. 五,mysql优化——sql语句优化小技巧

    1,大批量插入数据 (1)对于MyISAM: alter table table_name disable keys; loading data; alter table table_name ena ...

  7. IntelliJ IDEA配置maven3.3.3+mybatis3.1.1

    注:本文参考了孤傲苍狼关于MyBatis学习总结,在此表示感谢,原文链接为http://www.cnblogs.com/xdp-gacl/p/4261895.html. 1.新建project,勾选c ...

  8. jvm内存结构(一)(结构总览)

    jvm内存结构:<Java虚拟机原理图解>3.JVM运行时数据区 程序计数器: ,是执行的字节码的行号指示器,记录的是正在执行的虚拟机字节码指令的地址. ,每个线程都有独立计数器,互不干扰 ...

  9. 全屏背景图的实现及background的相关属性

    今天需要做一个占满设备宽度的轮播图,这里作为demo仅展示一张图,下面分别是要操作的图片(这里做了缩放处理,实际的图比较大),以及要实现的效果图,很明显两者是不成比例的:      (图一)     ...

  10. 【BZOJ4916】神犇和蒟蒻 杜教筛

    题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4916 第一个询问即求出$\sum_{i=1}^{n} { \mu (i^2)} $,考虑 ...