0%

深度学习网络对输入的数据进行多层的非线性变换操作, 不断耦合低层特征, 层层往上, 最后得到高层的语义表达

卷积神经网络

模型

gpt 175 billion netro cell

创建新解决方案 使用webapi模板 new -> Project -> ASP.NET Core Web API template
命令行工具参考Microsoft Doc: dotnet new

1
2
3
4
5
6
mkdir MyServices
cd MyServices
dotnet new sln
mkdir src
dotnet new webapi -lang C# -o src/MyServices.API
dotnet sln add src/MyServices.API/MyServices.API.csproj

添加class library项目
1
2
3
4
dotnet new classlib -lang C# -o src/MyServices.EntityManagers
dotnet new classlib -lang C# -o src/MyServices.Models
dotnet sln add src/MyServices.EntityManagers/MyServices.EntityManagers.csproj
dotnet sln add src/MyServices.Models/MyServices.Models.csproj

创建详细目录,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
─src
├───MyServices.API
│ ├───Controllers
│ ├───Infrastructure
│ │ ├───ActionFilters
│ │ ├───DbContext
│ │ ├───Helpers
│ │ ├───OData
│ │ └───Security
│ └───Properties
├───MyServices.EntityManagers
│ ├───interfaces
│ ├───Managers
│ └───Utilities
└───MyServices.Models
├───Contexts
├───DTO
├───Enums
└───Migrations

安装依赖
API layer

  • Microsoft.AspNetCore.Mvc.NewtonsoftJson
  • Microsoft.AspNetCore.OData √
  • Microsoft.OData.ModelBuilder
  • Microsoft.EntityFrameworkCore √
  • Microsoft.EntityFrameworkCore.Design √
  • Microsoft.EntityFrameworkCore.SqlServer √
  • Microsoft.EntityFrameworkCore.Tools √
  • Swashbuckle.AspNetCore √
    EntityManager layer
    None
    Model layer
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Design
  • Microsoft.EntityFrameworkCore.SqlServer

Microsoft DOc: Swagger/OpenAPI Swagger 项目已于 2015 年捐赠给 OpenAPI 计划,自此它被称为 OpenAPI。 是一个与语言无关的规范,用于描述 REST API。 它使计算机和用户无需直接访问源代码即可了解 REST API 的功能。

visual stuadio创建ASP.NET Core Web API项目模板,包含Enable OpenAPI support选项 即swagger页面
swagger
初始startup.cs的配置是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public void ConfigureServices(IServiceCollection services)
{

services.AddControllers();
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "WebApplication1 v1"));
}

app.UseHttpsRedirection();

app.UseRouting();

app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}

配置加载名为swagger.json的接口描述,记作WebApplication1 v1的接口文档

swagger.json不会自动生成 从controller获取接口文档由下述swagger的实现包完成

Swashbuckle.AspNetCore

启用xml注释
右键API项目 -> Properties -> Build -> Output
Output path 为空 即项目根目录
勾选XML documentation file 并命名
xmlswagger

1
2
3
4
5
6
7
8
9
10
11
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
c.DocInclusionPredicate((name, api) => api.HttpMethod != null);

// Locate the XML file being generated by ASP.NET
var xmlFiles = Directory.GetFiles(AppContext.BaseDirectory, "WebApplication1.API.xml", SearchOption.TopDirectoryOnly);

// Tell Swagger to use those XML comments.
xmlFiles.ToList().ForEach(xmlFile => c.IncludeXmlComments(xmlFile));
});

详情待续 参考Microsoft Doc:Swashbuckle入门

OData API的接口文档(存目)

百度旗下深度学习平台
介于网络问题 使用源码编译 参考PaddlePaddle在Windows下使用源码编译

1
cmake .. -G "Visual Studio 16 2019" -A x64 -DPY_VERSION=3.8 -DPYTHON_INCLUDE_DIR=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\include -DPYTHON_LIBRARY=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\Lib -DPYTHON_EXECUTABLE=C:\\Users\\qqqst\\AppData\\Local\\Programs\\Python\\Python38\\python.exe -DWITH_FLUID_ONLY=ON -DWITH_GPU=ON -DWITH_TESTING=OFF -DCMAKE_BUILD_TYPE=Release -DCUDA_TOOLKIT_ROOT_DIR="C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v11.3"

若使用其他MSBuild编译过 产生./build/CMakeFiles以及CMakeCache.txt 需要先删除

使用Release x64编译

Error C3848

Fix protobuf compile error

small_vector issue: length_error is not a member of std

pull request: betterpig/Paddle ‘vs2019’
Release x64, 先编译third_party,再编译solution 得到约50m的 build\python\dist*.whl

1
pip install -U xxx.whl

PaddleX GUI安装正确姿势 (2022.1.1 paddle v2.2)

Anaconda

大概是python工具链版本控制

windows start -> Anaconda3 -> Anaconda Prompt
创建激活conda环境

1
2
3
4
# 创建名为my_paddlex的环境,指定Python版本为3.8
conda create -n my_paddlex python=3.8
# 进入my_paddlex环境
conda activate my_paddlex

LabelMe

1
2
3
4
5
conda activate my_paddlex
conda install pyqt
pip install labelme
# 启动
labelme

ToDo

  • 主要的学习算法
  • 评估报告及指标的涵义 **
  • 模型预测实践
  • 结果详细参数导出 *

  • 圆形标记 -> 目标范围集合R = (U0,U1…Un)

  • 抠图
  • 导出目标滤波
  • 计算每个范围内的全物理量
  • 动态化统计阈值

    issues

    Cannot allocate ???kb memory on GPU 0, memory has been allocated and available memory is only 0.000000B.

Microsoft Teams开发人员文档

Teams App 实质是托管在Azure等服务端上的web app,Teams客户端类似于浏览器,打包部署直接用插件完成 此外微软提供sdk使之支持sso及授权访问功能

Microsoft 365 Developer Program

部署及发布Teams App需要Talent的管理员权限 加入Microsoft 365 Developer Program 创建开发者账号使用免费沙盒—> Microsoft 365计划

m365plan.PNG

安装vs code extraction:Teams Toolkit (preview)

创建项目

  • create a new Teams app
  • select capability: Tab
  • select hosting type: Azure
  • select language: JavaScript
  • input app name
    以上设置保存在.fx/settings.json
    ├───.fx
    │ settings.json
    │ package.json
    │ permissions.json
    ├───appPackage
    │ color.png
    │ manifest.source.json
    │ outline.png

    └───tabs
    │ .env
    │ .gitignore
    │ package.json
    │ README.md

    ├───public
    │ auth-end.html
    │ auth-start.html
    │ deploy.png
    │ favicon.ico
    │ hello.png
    │ index.html
    │ publish.png

    └───src
      │   index.css
      │   index.jsx
      │
      └───components
          │   App.css
          │   App.jsx
          │   Privacy.jsx
          │   Tab.jsx
          │   TabConfig.jsx
          │   TermsOfUse.jsx
    
    Tab其实就是个React App

    运行和调试

    press F5
    调试host为 https://localhost:3000
    偶见 localhost refused to connect. 查看Teams Toolkit的Accounts中side loading是否处于disabled状态

    Your Microsoft 365 tenant admin hasn’t enabled sideloading permission for your account. You can’t install your app to Teams!

出于种种原因造成的side loading disabled 应进入Microsoft365 Admin Center设置
Show all —> Admin centers —> Teams Apps —> Setup policies —> Global
打开 Upload custom apps

部署到Azure

先执行Teams Toolkit提供的DEPLOYMENT—>Provision in the Cloud功能,toolkit将以项目名称自行创建App Service、Storage Account及Vitual Network等Rescource

事实上,Teams Tab App的前端静态文件使用Azure Storage Account托管,访问控制通过托管标识(Managed Identity), 关于Provision时创建哪种资源见Provision cloud resources

使用Deploy to the Cloud 将当前项目作为Web App部署到前面Provision预备的资源上

记得配置Api的Endpoint 比如写/public/config.json

Zip Teams metadata package可获得该Web App的配置信息 包括名称及地址 以用于添加到Organization的Teams中

上传到teams

编译产生 build\appPackage.local.zip 即项目的应用包,该目录下还有应用部件清单 manifest.json

将应用包上传到teams中测试:Teams 左边栏点击Apps —> Manage your apps —> Upload an app to your org’s app catalog
上传后图标显示在Apps列表中 可将其添加到team的chat中
upload teams app

发布到组织

Todo List Sample (SPFx)

1
2
npm i -g teamsfx-cli // 安装脚手架
teamsfx new template list // 查看可用的sample

使用如下命令创建sample APP并基于这些sample作为模板开发自己的应用

1
teamsfx new template todo-list-SPFx

在teams中打开sharepoint站点
teams
配置一个list 见Microsoft Doc:
代码中/SPFx/src/webparts/todoList/components/SharePointListManager.ts line17 设置为sharepoint上list的名字
用vscode的Teams Toolkit打开项目
teams toolkit menu
选择项目目录打开
在teams toolkit中选择Provision in the cloud 在Cloud端创建app
teams provision**
点击Deploy to the cloud部署
点击Publish to the cloud发布
访问Microsoft Teams admin center查找已发布的app
登录Teams添加app
TODO 主动从外部系统向 Teams 发送信息,允许用户从 Teams 客户端内部处理该信息。
TODO 允许用户在另一个系统中快速查找信息,并将结果添加到 Teams 中的对话。

身份认证

Microsoft 或 Microsoft 365 帐户登录 Teams 后,应用用户可以使用你的应用,而无需再次登录。

如上图示,App添加到Teams,切换到该tab时 确认授权App访问Azure AD

步骤:
首先 在AzureAD注册app

trouble shooting

Teams Toolkit issue: Your Microsoft 365 tenant admin hasn’t enabled sideloading permission for your account. You can’t install your app to Teams

Microsoft Doc: Prepare Your M365 Tenant

Tab Appde的身份验证流程

图形跟随camera

1
2
const orientation = renderObject.renderer.getActiveCamera().getViewPlaneNormal(); // camera法向量
brushPipeline?.circle.setDirection(orientation[0], orientation[1], orientation[2]);

曾尝试actor.setOrientation失败 请使用source.setDirection

‘线’转为‘管道’

很多主流浏览器(包括Chrome)对webgl的实现中,设置线宽为1,在现阶段需要将line转为tube以实现‘线宽’

1
2
3
4
5
6
7
8
9
const updateTubeActor = (actor, polydata, lineWidth) => {
const filter = vtkTubeFilter.newInstance();
const mapper = actor.getMapper();
filter.setCapping(false);
filter.setNumberOfSides(10);
filter.setRadius(lineWidth);
filter.setInputData(polydata);
mapper.setInputConnection(filter.getOutputPort());
};

  • setCapping
  • setNumberOfSides
  • setRadius

get slice

RenderWindowInteractor

关于坐标

3d imaging
RenderWindowInteractor事件中使用屏幕像素坐标
而3D视图中是世界坐标

  • 模型坐标系 model coordinate system

  模型坐标系固定在模型上,该坐标系在建模时由建模者指定。

  • 世界坐标系 world coordinate system

  模型所处的位置,采用世界坐标系来描述。通常每个模型都有自己的坐标系,但是只有一个世界坐标系。在对模型进行旋转、平移、缩放时,世界坐标是不变的,但模型坐标系相对于世界坐标系的空间位置关系发生了变化。通常相机与光源也在世界坐标系中定义。

  • 视点坐标系 view coordinate system

  视点坐标系能够表达对相机可见的场景,其x和y坐标的范围在(-1,1)之间,z代表深度值。世界坐标系到视点坐标系之间的转换用4*4的相机矩阵来表达。

  • 屏幕坐标系 display coordinate system

      屏幕坐标系即图像坐标系,其坐标轴方向与视点坐标系一致,但是其x,y坐标值为像素坐标值。窗口尺寸决定了视点坐标与像素坐标的投影关系。不同的viewports(范围:0~1)能将同一个视点坐标系下的物体投影到不同的屏幕坐标系下。

物体最初在模型坐标系下建立,并展示在世界坐标系中。通过相机空间变换矩阵投影到视点坐标系下,并经viewport展示在屏幕上。
coordinate conversion

1
2
3
4
const computerDisplayToWorld = (x, y, z) => {
const view = renderObject.renderer.getRenderWindow().getViews()[0];
return view.displayToWorld(x, y, z, renderObject.renderer);
};

背景

公司Legacy SSO使用场景已经很少, 逐步转向Azure ADB2C,员工常遗忘其Legacy SSO的密码,
由于企业Azure ADB2C申请比较麻烦,而且资产系统需求未必符合普适性,故自行搭建SSO服务
参考CNBlog:从零搭建一个IdentityServer

需求

对于从未接触过Legacy SSO的员工以及未来Legacy SSO废止的风险下,允许员工使用其工号或邮箱+密码或邮件验证码通过认证

  • 跳转到Identity Server使用工号或邮箱+密码认证
  • NG Client APP使用Identity Server授予的access token访问后台
  • 忘记密码跳转到Identity Server使用邮箱验证码重置
    进阶
  • 将角色权限迁移至Identity Server

    is4

    identity server4 是作为OpenID Connect provider中间件

有限的免费: free for dev/testing/personal projects and companies or individuals making less than 1M USD gross annnual revenue

首先安装dotnet cli提供的identityserver模板

1
dotnet new -i IdentityServer4.Templates

提供了以下模板
IdentityServer4 with AdminUI is4admin
IdentityServer4 with ASP.NET Core Identity is4aspid
IdentityServer4 Empty is4empty
IdentityServer4 with Entity Framework Stores is4ef
IdentityServer4 with In-Memory Stores and Test Users is4inmem
IdentityServer4 Quickstart UI (UI assets only) is4ui
入门:
入门项目包含三个部分,身份认证服务(https://localhost:5001), API(https://localhost:44323/identity), Client(一个console program)

  1. 创建身份认证服务

    1
    2
    3
    4
    dotnet new is4empty -n IdentityServer
    cd ..
    dotnet new sln -n Quickstart
    dotnet sln add .\src\IdentityServer\IdentityServer.csproj

    在Config.cs中定义API scope

    1
    2
    3
    4
    5
    public static IEnumerable<ApiScope> ApiScopes =>
    new ApiScope[]
    {
    new ApiScope("api1", "My API")
    };

    在Config.cs中定义访问API的client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public static IEnumerable<Client> Clients =>
    new Client[]
    {
    new Client
    {
    ClientId = "client",
    ClientSecrets =
    {
    new Secret("secrec".Sha256())
    },
    AllowedGrantTypes = GrantTypes.ClientCredentials,
    AllowedScopes = { "api1" }
    }
    };

    该client使用clientCredential(id+secret)认证 允许访问名为api1的scope
    在startup.cs中载入资源以及client

    1
    2
    3
    4
    5
    6
    7
    public void ConfigureServices(IServiceCollection services)
    {
    var builder = services.AddIdentityServer()
    .AddDeveloperSigningCredential()
    .AddInMemoryApiScopes(Config.ApiScopes)
    .AddInMemoryClients(Config.Clients);
    }

    启动项目 导航到 https://localhost:5001/.well-known/openid-configuration

  2. 创建一个API, 并使用上面的IdentityServer作认证

    1
    2
    dotnet new webapi -n Api
    dotnet sln add .\Api\Api.csproj

    受保护的接口(protected interface)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [Route("identity")]
    [ApiController]
    [Authorize]
    public class IdentityController : ControllerBase
    {
    [HttpGet]
    public IActionResult Get()
    {
    return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
    }
    }

    在startup.cs配置认证

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void ConfigureServices(IServiceCollection services){
    ...
    services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options => {
    options.Authority = "https://localhost:5001";
    options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
    {
    ValidateAudience = false
    };
    });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env){
    ...
    app.UseAuthentication();
    app.UseAuthorization();
    }
  3. 写一个发请求的console program
    1
    2
    dotnet new console -n Client
    dotnet sln add .\Client\Client.csproj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
class Program
{
public static async Task Main(string[] args)
{
var client = new HttpClient();
var disco = await client.GetDiscoveryDocumentAsync("https://localhost:5001");
if (disco.IsError)
{
Console.WriteLine(disco.Error);
return;
}
var tokenResponse = await client.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "client",
ClientSecret = "secret",
Scope = "api1"
});;

if (tokenResponse.IsError)
{
Console.WriteLine(tokenResponse.Error);
return;
}

Console.WriteLine(tokenResponse.Json);

// call api
var apiClient = new HttpClient();
apiClient.SetBearerToken(tokenResponse.AccessToken);
var response = await apiClient.GetAsync("https://localhost:44323/identity");
if (!response.IsSuccessStatusCode)
{
Console.WriteLine(response.StatusCode);
}
else
{
var content = await response.Content.ReadAsStringAsync();
Console.WriteLine(JArray.Parse(content));

}
}
}

在vs中右键solution在Properties中配置Multiple startup projects,确认后开始运行(F5)
右键Client project —> Debug —> start new instance 因为控制台程序执行后关闭 在Program中打断点

  1. 认证之后是授权
    配置API使用Policy
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public void ConfigureServices(IServiceCollection services){
    ...
    services.AddAuthorization(options=> {
    options.AddPolicy("ApiScope", policy =>
    {
    policy.RequireAuthenticatedUser();
    policy.RequireClaim("scope", "api1");
    });
    });
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env){
    ...
    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllers()
    .RequireAuthorization("ApiScope");
    });
    }
    进阶:
  2. 以上是使用写死的id+secret通过认证,下面加入交互UI
    创建Mvc Client
    1

    配置认证
  3. 配置OpenId Connect

    Similar to OAuth 2.0, OpenID Connect also uses the scopes concept. Again, scopes represent something you want to protect and that clients want to access. In contrast to OAuth, scopes in OIDC don’t represent APIs, but identity data like user id, name or email address.

  4. 在Identity Server注册Mvc Client

使用entity framework库保存配置以及运行中数据

官方文档中基于上述Quickstart项目扩展,使前者In Memery的配置以及运行数据可以保存到数据库
github上的sample与使用is4ef模板生成的项目有差别
download sample源码 在此基础上开发自己的需求 加入IConfiguration并从appsettings.json读取connectionstring

源码在startup中定义了一个InitializeDatabase方法 在第一次启动时执行以初始化SQL Server数据库 之后就把它注释掉

将我们的client写入到数据库配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
INSERT INTO [dbo].[Clients]
([Enabled]
,[ClientId]
,[ProtocolType]
,[RequireClientSecret]
,[ClientName]
,[Description]
,[ClientUri]
,[LogoUri]
,[RequireConsent]
,[AllowRememberConsent]
,[AlwaysIncludeUserClaimsInIdToken]
,[RequirePkce]
,[AllowPlainTextPkce]
,[RequireRequestObject]
,[AllowAccessTokensViaBrowser]
,[FrontChannelLogoutUri]
,[FrontChannelLogoutSessionRequired]
,[BackChannelLogoutUri]
,[BackChannelLogoutSessionRequired]
,[AllowOfflineAccess]
,[IdentityTokenLifetime]
,[AllowedIdentityTokenSigningAlgorithms]
,[AccessTokenLifetime]
,[AuthorizationCodeLifetime]
,[ConsentLifetime]
,[AbsoluteRefreshTokenLifetime]
,[SlidingRefreshTokenLifetime]
,[RefreshTokenUsage]
,[UpdateAccessTokenClaimsOnRefresh]
,[RefreshTokenExpiration]
,[AccessTokenType]
,[EnableLocalLogin]
,[IncludeJwtId]
,[AlwaysSendClientClaims]
,[ClientClaimsPrefix]
,[PairWiseSubjectSalt]
,[Created]
,[Updated]
,[LastAccessed]
,[UserSsoLifetime]
,[UserCodeType]
,[DeviceCodeLifetime]
,[NonEditable])
VALUES
(1
,'angular_spa'
,'oidc'
,0
,null
,null
,null
,null
,0
,1
,0
,1
,0
,0
,0
,null
,1
,null
,1
,0
,300
,null
,3600
,300
,null
,2592000
,1296000
,1
,0
,1
,0
,1
,1
,0
,'client_'
,null
,SYSDATETIME()
,null
,null
,null
,null
,300
,0)

写入client scope
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('openid'
,3);
INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('profile'
,3);
INSERT INTO [dbo].[ClientScopes]
([Scope]
,[ClientId])
VALUES
('api1'
,3)

client cors配置

1
2
3
4
5
6
INSERT INTO [dbo].[ClientCorsOrigins]
([Origin]
,[ClientId])
VALUES
('http://localhost:4200'
,3)

到这一步 angular spa 可以完成到identity server的跳转但是显示授权错误“Sorry, there was an error : unauthorized_client
Unknown client or client not enabled”
1
2
3
4
5
6
7
8

INSERT INTO [dbo].[ClientGrantTypes]
([GrantType]
,[ClientId])
VALUES
('implicit'
,3)
GO

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
INSERT INTO [dbo].[ApiResources]
([Enabled]
,[Name]
,[DisplayName]
,[Description]
,[AllowedAccessTokenSigningAlgorithms]
,[ShowInDiscoveryDocument]
,[Created]
,[Updated]
,[LastAccessed]
,[NonEditable])
VALUES
(1
,'api1'
,'AMS API'
,null
,null
,1
,SYSDATETIME()
,null
,null
,0)
GO

安装entityframework sqlserver依赖
1
2
dotnet add package IdentityServer4.EntityFramework
dotnet add package Microsoft.EntityFrameworkCore.SqlServer

模板使用的是sqlitedb 见startup.cs

1
2
3
4
services..AddConfigurationStore(options =>
{
options.ConfigureDbContext = builder => builder.UseSqlite(connectionString);
})

  • ConfigurationDbContext - 配置数据如 clients, resources, scopes
  • PersistedGrantDbContext - 临时处理数据如 authorization codes, refresh tokens

用户数据库上下文

1
2
dotnet ef migrations add InitUserContext -c AMSIS.Data.UserContext -o Data/Migrations/UserDb
Update-Database -c AMSIS.Data.UserContext

login/logout workflow 和 重定向

当token无效时(比如后台校验jwt返回前台401)前台spa应跳转至登录页如 http://localhost:44365/account/login?returnUri=http%3A//localhost%3A4200/passport/callback

spa应在路由到callback时从url中取得token存localstorage

registry workflow

跳转到注册页 填表单 保存profile
应在业务领域分离出用户/账户信息 使用从identityserver取得的openid关联本业务领域数据

返回包含自定义Claim的Profile

为自己的用户体系实现认证接口

部署到http

lax cookie policy