Asp.net core 学习笔记之 authen + autho + oidc + oauth + spa 第三篇 (各种 account 操作, create, login, logout, change password, reset password)

这篇来看看一般的操作

会讲到的 

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)

换密码需要旧密码. 可能发生得错误是

当前密码错误或者是新密码格式不对.

change password 会改变 security stamp, 所以需要 refreshSignInAsync, 之前有提过关于 how security stamp work, 不记得可以看回去
 
 
5. reset password
要 reset password 首先要 generate 一个 code

说到 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 格式不对.

 

 

原文地址:https://www.cnblogs.com/keatkeat/p/14437567.html