美文网首页
ASP.NET Core Identity 库表分析

ASP.NET Core Identity 库表分析

作者: elef | 来源:发表于2019-01-03 09:55 被阅读66次
IdentityTables.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

指示当前用户是否开启了双因子验证

Identity脚本下载

摘自:https://segmentfault.com/a/1190000014966349

相关文章

网友评论

      本文标题:ASP.NET Core Identity 库表分析

      本文链接:https://www.haomeiwen.com/subject/xvnxrqtx.html