前言

这篇来聊聊常见操作.

会讲到:

Create Account

Login

Logout

Change Password

Reset Password (by email)

External Login (Google, Facebook, Microsoft)

不会讲到: (因为我没有用到. 以后有才补上吧)

Two Factor

Email/Phone Confirmation

Create Account

创建 User Entity, 然后用 UserManager.CreateAsync 把密码放进去就 ok 了

UserManager.cs

没有什么特别的, 验证和更新冗余的值, 然后通过 store 去创建.

ValidateUserAsync 包含了 username, email, password 的验证. 如果想扩展也是可以, 它在 options 是一个 array 来的, push 进去就多一个.

username 是 unique, 格式可以通过 options 来走限制.

email 的话格式要对之外, 是不是 unique 也是可以调

这里有一个小小的奇葩, 当 requireUniqueEmail = false 的时候, email 将完全不会被 validation, 连写错格式也不会检查....

是不是挺可爱的..

password 的 validator 也是可以配置

Login

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

SignInManager.cs

注入

默认

2. IsLockedOut

就是密码失败太多次, 被锁掉了

options 可以调次数和锁多久, AllowedForNewUsers 默认是 true, false 的话就是说不要这个锁机制, 如果后来想要就自己才调用方法打开它.

3. Failed

就是密码错了. 最后一次密码错误然后被锁的话, 会返回被锁哦.

4. RequiresTwoFactor

虽然登入密码是正确了, 但是依然 Succeeded = false, 这是因为有要求 Two Factor, 这里不多解释因为我还没有用到.

Logout

要登出就 redirect 到 logout page, 然后里面调用 SignOut 然后 redirect 就可以了. 在 Without Identity 那篇有提到, authen 的 SignOut 是会自动 redirect 的.

Identity 这里依然手动写了 redirect 是因为假设 returnUrl 是 null 的情况下 context.SignOut 是不会 redirect 的. 所以算是做了一个保护吧.

Change password

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

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

change password 会改变 security stamp, 所以需要 RefreshSignInAsync, 之前有提过关于 how security stamp work, 不记得可以回去看.
 
 

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

这里显示了所有 token 的默认配置.

如果要设定 data protector token 的期限的话是这样

services.Configure<DataProtectionTokenProviderOptions>(
x => x.TokenLifespan = TimeSpan.FromHours(1));

默认是 1 天.

TOTP 的话默认是 9 分钟, 无法配置

之前在 Asp.net core Identity + identity server + angular 学习笔记 (第二篇) 有聊过这个,目前没有用到了,所以我也不关心了.

Code 做好之后就发 email, 然后去 reset password 的页面把 code 和 password 放进去就可以了. 这里可能发生的错误是 code 不正确 (过期也算是不正确),  或者 new password 格式不对.

External Login

Microsoft, Google, Facebook

3 个大同小异, 我用 Google 来做例子.

首先去 Google 申请获取 Client Id 和 Client Secret.

装 NuGet Microsoft.AspNetCore.Authentication.Google

setup service

services
.AddAuthentication()
.AddGoogle(options =>
{
options.ClientId = "123456789006-3b1dbr2m98d4503uc95hed48omph03e1.apps.googleusercontent.com";
options.ClientSecret = "abcdefgh-ey5xkLPlXlJctnw";
});

如果想要获取更多授权可以加 scope 哦, 比如

.AddMicrosoftAccount(options =>
{
options.ClientId = "...";
options.ClientSecret = "...";
options.AccessDeniedPath = "/account/signin-microsoft-denied"; // 用户拒绝登入会带去这里
options.SaveTokens = true; // 声明之后我们需要用到 access token 或 refresh token
options.Scope.Add("https://graph.microsoft.com/User.ReadBasic.All");
options.Scope.Add("https://graph.microsoft.com/Calendars.ReadWrite");
options.Scope.Add("https://graph.microsoft.com/Mail.ReadWrite");
options.Scope.Add("offline_access"); // 声明要返回 refresh token (我们会用到)
options.AccessType = "offline"; // Google 不支持 scope offline_access, 可以改用这个方法
// options.AuthorizationEndpoint += "?prompt=consent"; // 声明每一次都 popup 要求 scope. (没有声明的话, 如果 user 以前 allow 了那它就不会再问多一次)
})

SaveTokens 表示我们后续会需要直接用到 access token (默认 Identity 是不返回 access token 让我们用的. 开启后就可以通过 claims 拿到 access token call API 了)

offline_access 或者 AccessTyoe 是要求 refresh token, 不同 provider 做法可能不同. (Google 用 AccessType, Microsoft 用 scope offline_access)

然后在 login page 做一个 external login form

@inject SignInManager<User> SignInManager

<form method="post" action="?handler=ExternalLogin" asp-antiforgery="true">
<div>
<p>
@foreach (var provider in (await SignInManager.GetExternalAuthenticationSchemesAsync()).ToList())
{
<button type="submit" name="dto.provider" value="@provider.Name">@provider.DisplayName</button>
}
</p>
</div>
</form>

通过 SignInManager 可以获取到所有支持的 external login.

然后需要一个 OnPost 来处理这个 form post

public IActionResult OnPostExternalLogin([FromForm] ExternalLoginDto dto)
{
var properties = _signInManager.ConfigureExternalAuthenticationProperties(dto.Provider, "/account/login");
return new ChallengeResult(dto.Provider, properties);
}

/acount/login 是 callback 页面, 如果用户登入, 就跳转到那里, 如果用户不登入, 那么会跳转到 options.AccessDeniedPath.

进入 /account/login 后, 通过 SignInManager 获取 external login info, 然后想干嘛就干嘛 (要搞清楚哦, 这个是 external login 并不是我们的 App Login)

public async Task OnGetAsync()
{
var info = await _signInManager.GetExternalLoginInfoAsync();
if (info != null)
{ }
}

所以接下来才看是要 login to our app or register a new account 等等

参考 Identity 模板

Identity – User Login, Forgot Password, Reset Password, Logout的更多相关文章

  1. Reset Password Functionality FAQ

    In this Document   Purpose   Questions and Answers   How can users request a password reset?   How d ...

  2. Mysql re-set password, mysql set encode utf8 mysql重置密码,mysql设置存储编码格式

    There is a link about how to re-set password. http://database.51cto.com/art/201010/229528.htm words ...

  3. Sign in with the app-specific password you generated. If you forgot the app-specific password or need to create a new one, go to appleid.apple.com

    iOS打包报错信息如下:Sign in with the app-specific password you generated. If you forgot the app-specific pas ...

  4. Dynamics CRM Online Administrator password reset

    道道还挺多,好好看看 Dynamics CRM Online Administrator password reset

  5. MetInfo Password Reset Poisoning By Host Header Attack

    if we know some user's email, the we will can reset the user's email by host header attack. The atta ...

  6. CMSEASY /lib/tool/front_class.php、/lib/default/user_act.php arbitrary user password reset vulnerability

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 攻击者通过构造特殊的HTTP包,可以直接重置任意用户(包括管理员)的密码 ...

  7. Fortify Audit Workbench 笔记 Password Management: Password in Configuration File(明文存储密码)

    Password Management: Password in Configuration File(明文存储密码) Abstract 在配置文件中存储明文密码,可能会危及系统安全. Explana ...

  8. jenkins password reset,and git integration

      0. SSH to server 1. Edit /opt/bitnami/apps/jenkins/jenkins_home/config.xml 2. set userSecurity to ...

  9. How to reset password for unknow root

    1. Click "e" when entering the grub 2. Add option " init=/bin/sh" to linux line. ...

  10. reset password for local admin on Windows2016 by Powershell

    上脚本吧,找半天 $password = "yourpassword" $pwd = $password | ConvertTo-SecureString -asPlainText ...

随机推荐

  1. K8S 中的 CRI、OCI、CRI shim、containerd

    哈喽大家好,我是咸鱼. 好久没发文了,最近这段时间都在学 K8S.不知道大家是不是和咸鱼一样,刚开始学 K8S.Docker 的时候,往往被 CRI.OCI.CRI shim.containerd 这 ...

  2. [oeasy]python017_万行代码之梦_vim环境_复制粘贴

    继续运行 回忆上次内容 上次 保存运行一条龙 :w|!python3 %   我想 再多输出 几行 增加一下 代码量 可以吗?       添加图片注释,不超过 140 字(可选) 代码量 在正常模式 ...

  3. [oeasy]python0016_编码_encode_编号_字节_计算机

    ​ 编码(encode) 回忆上次内容 上次找到了字符和字节状态之间的映射对应关系 字符对应着二进制字节 二进制字节也对应着字符 这种字节状态是用2位16进制数来表示的 hex(n)可以把数字转化为 ...

  4. Django 结合Vue实现前端页面导出为PDF

    Django结合Vue实现前端页面导出为PDF by:授客 QQ:1033553122 测试环境 Win 10 Python 3.5.4 Django-2.0.13.tar.gz 官方下载地址: ht ...

  5. [WPF] 脱机环境实现支持拼音模糊搜索的AutoCompleteBox

    AutoCompleteBox是一个常见的提高输入效率的组件,很多WPF的第三方控件库都提供了这个组件,但基本都是字符串的子串匹配,不支持拼音模糊匹配,例如无法通过输入ldh或liudehua匹配到刘 ...

  6. 【数学建模导论】Task01 数据处理与拟合模型

    0 前言 感谢 DataWhale 的开源学习课程 intro-mathmodel,项目仓库在这. 现在开始,跟着Task01 进入数据类的学习,实现每一个代码,包括数据预处理.回归分析与分类分析.假 ...

  7. Rust 中 *、&、mut、&mut、ref、ref mut 的用法和区别

    Rust 中 *.&.mut.&mut.ref.ref mut 的用法和区别 在 Rust 中,*.ref.mut.& 和 ref mut 是用于处理引用.解引用和可变性的关键 ...

  8. 【Windows】开放共享目录

    在项目里面做数据迁移时发现,WindowsServer的多个主机可以进行磁盘共享访问 但是自己设置是灰白无法点击的 文件目录共享还是可以进行设置的 1.找到自己需要共享的目录,右键选择[属性],并找到 ...

  9. nvidia官方AI框架软件的命令行操作接口 —— NVIDIA GPU Cloud (NGC) CLI

    NVIDIA GPU Cloud (NGC) CLI 安装介绍地址: https://org.ngc.nvidia.com/setup/installers/cli 安装好后需要输入自己的NVIDIA ...

  10. 国产首款IDE环境:数字广东公司联合麒麟软件打造的国内首款适配国产操作系统、蜘蛛创新的集成开发环境CEC-IDE正式亮相

    参考: https://www.youtube.com/watch?v=fOpBEWZVKU0 在中国it历史上继"木兰编程语言(实际上套壳Python),红旗操作系统(实际上套壳Chrom ...