这篇来看看一般的操作
会讲到的
create account
login
logout
change password
reset password (by email)
不会讲到的 (因为我自己没有用到了. 以后有才补上吧)
external login (google, facebook 等)
two factor
account email/phone confirmation
1. Create account (Register.cshtml.cs)
创建 user entity 然后使用
userManager.CreateAsync 把密码放进去就 ok 了
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Extensions.Core/src/UserManager.cs
没有什么特别的, 验证和更新冗余的值然后就通过 store 去创建.
ValidateUserAsync 包含了 username, email, password 的验证. 如果我们想扩展也是可以, 它是一个 array 来的, push 进去就多一个.
username 是 unique, 格式可以通过 options 来走限制
email 的话格式要对之外, 是不是 unique 也是可以调
这里有一个小小的奇葩, 当 requireUniqueEmail = false 的时候, email 将完全不会被 validation, 连写错格式也不会检查....
是不是挺可爱的..
password 的 validator 也是可以配置
2. Login (Login.cshtml.cs)
在 without identity 那篇有讲到 SignIn 底层就是 principal claim + cookie Persistent
这个 signInManager 的流程就是通过 username + password 去匹配 user account 然后通过 user to claim 生成 principal (就不翻源码了)
remenber me 就是 cookie persistent
lockoutOnFailure 就是防玻璃破解的. 机制是试错到一个数量之后, account 将被锁起来一个时间.
login 有几种失败的可能 :
1.IsNotAllowed
在 options 可以调 RequireConfirmedEmail, RequireConfirmedPhoneNumber, RequireConfirmedAccount
如果 user 没有达到要求就无法登入了. RequireConfirmedAccount 默认是检查看 email 是否有 confirm
在 SignInManger.CanSignAsync 里头
注入
默认
2. IsLockedOut
就是密码失败太多次了, 被锁掉了
options 可以调次数和锁多久, AllowedForNewUsers 默认是 true, false 的话就是说不要这个锁机制, 如果后来想要就自己才调用方法打开它.
3. Failed
就是密码错了. 最后一次密码错误然后被锁的话,会返回被锁哦
4. RequiresTwoFactor
虽然登入密码是正确了, 但是依然 Succeeded = false, 这是因为有要求 two factor, 这里不多解释因为我没有用到.
3. Logout (Logout.cshtml.cs)
要登出就 redirect 到 logout page, 然后里面调用 SignOut 然后 redirect 就可以了. 在 without identitty 篇的时候我有说过, authen 的 SignOut 是会自动 redirect 的.
identity 这里依然手动写了 redirect 逻辑是因为假设 returnUrl 是 null 的情况下 context.SignOut 是不会 redirect 的. 所以算是做了一个保护吧
4. Change password (ChangePassword.cshtml.cs)
换密码需要旧密码. 可能发生得错误是
当前密码错误或者是新密码格式不对.
说到 generate code 就非得说到 token 了
identity token 分 2 种
TotpSecurityStampBasedTokenProvider 和 DataProtectorTokenProvider
topt 是 6 个号码, data protector 是很长的乱码
默认的几个匹配
defaultProvider 用的是 data protector 使用范围包括 : email confirmation, reset password, change email
DefaultEmailProvider 用的是 totp 使用范围不清楚 (没找到哪里有用到)
DefaultPhoneProvider 用的是 totp 使用范围包括: change phone number
如果要改配置的话
在 identity options 中有一个 token options
TokenOptions.cs
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Extensions.Core/src/TokenOptions.cs
这里显示了所有 token 的默认配置.
如果要设定 data protector token 的期限的话是这样
services.Configure<DataProtectionTokenProviderOptions>( x => x.TokenLifespan = TimeSpan.FromHours(1));
默认是 1 天.
totp 的话默认是 9 分钟, 无法配置
https://www.cnblogs.com/keatkeat/p/10773693.html 之前有聊过这个,目前没有用到了,所以我也不关心了。
code 做好之后就发 email, 然后去 reset password 的页面, 然后把 code 和 password 放进去就可以了. 这里可能发生的错误是 code 不正确 (过期也算是不正确), 或者 new password 格式不对.