Asp.net core 学习笔记之 authentication + authorization + identity + identity server 4 + angular 第二篇 (Introduction, Scaffold, Overview)
1. Introduction to Identity
dotnet new webapp --auth Individual -uld -o WebApp1
new webapp 是做一个 razor page
--auth Individual 就是表示要包含 identity
-uld 是 use local database (本地数据库, 默认是用 SQLite)
-o WebApp1 是 output 项目名字
运行上面 command 后, 所有代码就写好了. 它是搭配 ef core 的哦. 接下来就是通过 ef migration 创建数据库了
dotnet ef database update
接着在 private 页面放上 authorize 标签就可以跑了
有一个小 point 要记入, app.UseAuthentication 的位置蛮重要的,
2. Scaffold Identity
之所以几行 command 就可以跑是因为微软对 identity 做了一个封装, 这个封装还包括了 view (这个技术叫 Razor Class Library 简称 RCL)
我们来从一个 webapp 没有 authentication 的做起.
先装好 global 工具
dotnet tool install -g dotnet-aspnet-codegenerator
// 做一个新项目, 没有 authentication 的
dotnet new webapp -o ScaffoldIdentity
// 进入项目 folder
cd ScaffoldIdentity
// 装 package
dotnet add package Microsoft.VisualStudio.Web.CodeGeneration.Design
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore
dotnet add package Microsoft.AspNetCore.Identity.UI
dotnet add package Microsoft.EntityFrameworkCore.SqlServer
dotnet add package Microsoft.EntityFrameworkCore.Tools
// generate identity code template
dotnet aspnet-codegenerator identity --useDefaultUI
// 做数据库
dotnet ef migrations add CreateIdentitySchema
dotnet ef database update
跑完上面的 command 后, 在 startup 添加 UseAuthentication
然后在 layout view 添加, 就可以了
当然这个只是演示让我们知道它是怎样 work 起来的, 真实开发还是差很多的. 之后慢慢讲.
这里有几个 point 可以记入一下.
有一个 file IdentityHostingStartup.cs, 里面封装了 service 的调用, 所以我们在 startup 看不到,
然后所有的 view 都是看不见 source code 的.
除非在我们没有声明 --files 和 --useDefaultUI 那么所有的 source code 都会显示出来 (这正是我们需要的, 不然怎么魔改呢 ?)
3. Identity Overview
既然 Scaffold 帮我们搞了这么多代码, 那我们一个一个来看看 identity 框架的代码时如何工作得。要魔改自然要先摸清楚咯.
首先是 database entity
public class ScaffoldIdentityIdentityDbContext : IdentityDbContext<IdentityUser>
{
public ScaffoldIdentityIdentityDbContext(DbContextOptions<ScaffoldIdentityIdentityDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
可以看到就是把平常得 DbContext 继承了 IdentityDbContext
Identity 封装了许多得 model, 比如 IdentityUser, IdentityRole 等等啦.
有了这些, 数据库就搞定了.
接下来就是 Startup 的 service provide
services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<ScaffoldIdentityIdentityDbContext>();
完整源码去这里下载 https://github.com/dotnet/aspnetcore/tree/main/src/Identity
2 年前我超讨厌看 .net 源码的, 东一个西一个, 幸好现在全部放一起了.
这里的源码需要稍微看一下,因为大部分情况我们是需要修改的.
AddDefaultIdentity
services.AddAuthentication 是 asp.net core authentication 的 service 来的哦
AddIdentityCookies
里面负责了 cookie schemes 的代码
负责UserManger 之类的
AddDefaultUI
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/UI/src/IdentityBuilderUIExtensions.cs
负责 Ui 的咚咚, SignInManager 也在这里哦
AddDefaultTokenProviders
https://github.com/dotnet/aspnetcore/blob/main/src/Identity/Core/src/IdentityBuilderExtensions.cs
Email, Phone reset password 这些 token 的做法
还有一个叫 AddIdentity 的
这个是以前还没有 Default UI 的时候的, 简单说就是你要什么就拿什么来用,拿什么来改就是了. 最重要的是全部过一遍知道它都搞了些啥.
原文地址:https://www.cnblogs.com/keatkeat/p/14437557.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- vue 中自定义指令改变data中的值
- ubuntu临时或永久修改hostname的方法
- Android 通过网络图片路径查看图片实例详解
- 解决 java.lang.NoSuchMethodError的错误
- 全面解析Node.js 8 重要功能和修复
- java @interface 注解详解及实例
- Android通过访问网页查看网页源码实例详解
- Asp.net MVC SignalR来做实时Web聊天实例代码
- PHP手机号中间四位用星号*代替显示的实例
- c++常量详解
- C++ 常量成员常量返回值详解
- C++常量详解一(常量指针与常量引用的初始化)
- C++常量详解二(常量形参,常量返回值,常量成员函数)
- c++中cin/cout与scanf/printf的区别比较
- Struts2实现上传单个文件功能