![](https://img.haomeiwen.com/i5833359/0d209b7eedcb5196.png)
_EFMigrationsHistory 是 Ef的迁移历史表不必关注此表
AspNetUserClaims、AspNetRoleClaims是用户和角色的声明表, Identity 是基于声明的认证模式(Claims Based Authentication)的,Claim在其中扮演者很重要的角色,甚至角色(Role)都被转换成了Claim。
AspNetUsers、AspNetRoles和AspNetUserRoles存储用户和角色信息。
AspNetUserTokens、AspNetUserLogins存储的是用户使用的外部登陆提供商的信息和Token,外部登陆提供商指的是像微博、QQ、微信、Google、微软这类提供 oauth 或者 openid connect 登录的厂商。
接下来就要解释下最为重要的一张表AspNetUsers
用户数据核心存储—— AspNetUsers
刚刚注册的用户的切实数据如下
Id AccessFailedCount ConcurrencyStamp Email EmailConfirmed LockoutEnabled LockoutEnd NormalizedEmail NormalizedUserName PasswordHash PhoneNumber PhoneNumberConfirmed SecurityStamp TwoFactorEnabled UserName
------------------------------------ ----------------- ------------------------------------ ----------------- -------------- -------------- ---------- ----------------- ------------------ ------------------------------------------------------------------------------------ ----------- -------------------- ------------------------------------ ---------------- -----------------
d4929072-e704-447c-a9aa-e1b7f510fd37 0 5765da8f-1945-40c6-8f81-97604739e5ec xxxxxxxx@163.com 0 1 NULL XXXXXXXX@163.COM XXXXXXXX@163.COM AQAAAAEAACcQAAAAEHQ+3Z9h0tiUsinNPs8B99skAqbXh0zcWlGWTgTVik6S85viEWQFV8TF8bRyDTW8rw== NULL 0 a4d9c858-cc08-4ceb-8d5d-92a6cb1c40b8 0 xxxxxxxx@163.com
Id
主键 默认是 nvarchar(450) 但事实上是存储的Guid字符串,另外值得一提的是Id的创建时机
主键的Guid是在创建用户时在构造函数中生成的
也就是说它是完全随机的无序Guid,那么它可能带来的隐患就是当用户量非常大的时候,创建用户可能变慢,不过对于绝大多数情景来讲,这不太可能(有那么多的用户),当然这可能发生,可使用bigint作为主键。
AccessFailedCount
这个是用来记录用户尝试登陆却登陆失败的次数,我们可以通过这个来确定在什么时候需要锁定用户,
ConcurrencyStamp
同步标记,每当用户记录被更改时必须要更改此列的值,事实上存储的是Guid,并且在创建用户模型的时候直接在属性上初始化随机值
Email、NormalizedEmail
Email就是Email,NormalizedEmail是 规范化后的Email
什么是规范化呢?
在我们刚刚创建的用户中,可以看到 NormalizedEmail 只是将email 的值变成大写了。
UserName 、NormalizedUserName
UserName就是UserName NormalizedUserName 还是规范化之后的UserName,也就是转换到大写
它们的行为和上述的 Email、NormalizedEmail 一致,就不赘述了
EmailConfirmed
邮件已经确认,这是个bit(bool)类型的列,前文提到Identity含有发送和验证确认邮件的功能,在创建用户的时候这个值默认是false ,确认链接由 Identity生成,之后交由 IEmailSender发送。
LockoutEnabled、LockoutEnd
他们的数据类型是 bit和datetimeoffset(7),LockoutEnabled指示这个用户可不可以被锁定,LockoutEnd指定锁定的到期日期,null 或者一个过去的时间,代表这个用户没有被锁定
PasswordHash
密码哈希,Identity使用的hash 强度是比较高的,暴力破解的难度十分大
SecurityStamp
安全标记,一个随机值,在用户凭据相关的内容更改时,必须更改此项的值,事实存储的是Guid
它的更改时机有:
- 用户创建
- 更改用户名
- 移除外部登陆
- 设置/更改邮件
- 设置/更改电话号码
- 设置/更改双因子验证
- 更改密码
同ConcurrencyStamp一样,SecurityStamp也是在程序中由代码控制更改的
PhoneNumber、PhoneNumberConfirmed
电话和电话已确认,比较容易理解
TwoFactorEnabled
指示当前用户是否开启了双因子验证
网友评论