更新 :

id4 使用这个 DbContext 哦

dotnet ef migrations add identity-server-init --context PersistedGrantDbContext

参考

https://docs.microsoft.com/en-us/azure/key-vault/key-vault-use-from-web-application#authenticate-with-a-certificate-instead-of-a-client-secret
https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps
https://identityserver4.readthedocs.io/en/release/topics/crypto.html#signing-key-rollover
https://mcguirev10.com/2017/12/23/easy-configuration-sharing-with-azure-key-vault.html
https://mcguirev10.com/2018/01/10/storing-certificates-azure-keyvault.html
https://mcguirev10.com/2018/01/04/localhost-ssl-identityserver-certificates.html

identity server 4 (简称 ids) 是一个做认证和授权的小工具.

asp.net core 自带的 identity 虽然蛮牛的,但是基于 cookies 不适合手机开发。

与其说手机开发,干脆点事不适合前后端分离的开发模式.

前后端分离是做 web application 或 mobile application 时常用的手法.

显然 asp.net core identity 目前还是偏向后端输出 html 的方案,而不是基于 Web Api.

如果开发 Web Application 通常项目会比较复杂,前后端分离,Web Api 就需要 access token (Json Web Token)

这类的方式, 还有授权也是一样, oauth 2.0 也是经常会用到的.

ids 除了支持 oauth 2.0 还支持 OpenId Connect

我们从前都是用 oauth 2.0 来干 Open Id 做的事情,所以突然多了一个东西我开始的时候是觉得很奇怪的。

慢慢明白, oauth 是用于授权, open id 则是认证.

认证以后,我们通常是需要识别这个人的,比如 username profile claim 等等.

而 oauth 授权只是给你一个 access token 有能力去操作一些东西,但是并没有直接告诉你用户。

而从前我们是通过 access token + getUserProfile 这类的 api 才完成了现在 open id 做的事情。

所以有了 open id 职责就划分的更好了,更规范了。

上面说的整套 ids 都做好了, 但我目前的需求其实也只是要支持 token based 而已. 还不需要 oauth 2.0 或 openid

但是自带的 identity 目前又还不支持 token based, net core 2.2 貌似会有一个中间版本, 把 identity 加强支持 token based.

所以呢,我只能暂时拿 ids 大材小用了.

本来也考虑要自己写一个 JWT 的机制,但是后来想想这样很傻,毕竟我是写业务的程序员,怎么还要干这么技术的事情呢... 对吧.

对比 identity cookies based, token based 有 2 点很不同,

1. 刷新机制.

cookies based 我们可以通过每一次请求,服务器 response 来让 cookie 保存新鲜. 但是基于 header 的 token based 完全就没有办法做到这点。

所以必须弄多一个 refresh token 出来.

2. 加密机制

token based 通常是用 JWT 它是用非对称加密, 而 cookie based 通常是使用对称加密.

identity 内部使用了 asp.net core data protection 来加密

ids 则需要我们去弄一个 self signed certificate.

ids 的过程是这样的。

有 3 个角色, 认证服务器(登入的地方), 资源服务器 (一般的 web api 站点), 客户端 (用户游览器)

用户想访问受保护的资源就必须先通过认证服务器登入和授权 (scope, claim 等),oauth 2.0, 4 中方式都可以.

获取到 token 之后访问资源服务器, 资源服务器会去认证服务器获取 document (里面会有认证服务器的资讯,比如 endpoint, 公钥等等), 然后资源服务器发起请求.

整套都是很有规范的.

当然你要把认证服务器和资源服务器放一起也是可以的, 但是走的流程是一样的.

Self signed certificate

参考

https://docs.microsoft.com/en-us/azure/key-vault/key-vault-use-from-web-application#authenticate-with-a-certificate-instead-of-a-client-secret
https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps
https://identityserver4.readthedocs.io/en/release/topics/crypto.html#signing-key-rollover
https://mcguirev10.com/2017/12/23/easy-configuration-sharing-with-azure-key-vault.html
https://mcguirev10.com/2018/01/10/storing-certificates-azure-keyvault.html
https://mcguirev10.com/2018/01/04/localhost-ssl-identityserver-certificates.html

// start -> Windows PowerShell -> run as admin
$PfxFilePath = "c:\keatkeat\self-signed-certificate\bestway.pfx"
$CerFilePath = "c:\keatkeat\self-signed-certificate\bestway.cer"
$DNSName = "localhost"
$Password ="Password"
$friendlyName = "bestway"
$SecStringPw = ConvertTo-SecureString -String $Password -Force -AsPlainText
$Cert = New-SelfSignedCertificate -KeyFriendlyName $friendlyName -FriendlyName $friendlyName -DnsName $DNSName -CertStoreLocation "cert:\LocalMachine\My" -NotAfter $((Get-Date).AddYears(50))
Export-PfxCertificate -cert $cert -FilePath $PFXFilePath -Password $SecStringPw
Export-Certificate -cert $cert -FilePath $CerFilePath

    X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
//var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "3de296d7b86ea9f6c2feec925134194ad54c09c6".ToUpper(), true);
var certificates = store.Certificates.Find(X509FindType.FindByThumbprint, "bb417dee655caebfc85f0ab448db54becc6a495c".ToUpper(), true);
var certificate = certificates[];
services.AddIdentityServer()
.AddSigningCredential(certificate)
//.AddSigningCredential(new X509Certificate2(@"C:\keatkeat\self-signed-certificate\test-id4-four.pfx", "password"))
//.AddValidationKey(new X509Certificate2(@"C:\keatkeat\self-signed-certificate\test-id4.pfx", "password"))
//.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients());

run -> certmgr.msc 管理证书

Asp.net core 学习笔记 ( identity server 4 JWT Part )的更多相关文章

  1. Asp.net core 学习笔记 ( Identity 之 Authentication )

    和从前的 identity 区别不是很大. 从 2.1 开始 vs 模板的 identity 都被封装了起来, 你几乎看不到任何一行代码, 需要向下面这样打开它, 才能做修改. 说一下比较常用的配置 ...

  2. Asp.Net Core学习笔记:入门篇

    Asp.Net Core 学习 基于.Net Core 2.2版本的学习笔记. 常识 像Django那样自动检查代码更新,自动重载服务器(太方便了) dotnet watch run 托管设置 设置项 ...

  3. ASP.NET Core 学习笔记 第一篇 ASP.NET Core初探

    前言 因为工作原因博客断断续续更新,其实在很早以前就有想法做一套关于ASP.NET CORE整体学习度路线,整体来说国内的环境的.NET生态环境还是相对比较严峻的,但是干一行爱一行,还是希望更多人加入 ...

  4. Asp.Net Core: Swagger 与 Identity Server 4

    Swagger不用多说,可以自动生成Web Api的接口文档和客户端调用代码,方便开发人员进行测试.通常我们只需要几行代码就可以实现这个功能: ... builder.Services.AddSwag ...

  5. Asp.net core 学习笔记 SignalR

    refer : https://kimsereyblog.blogspot.com/2018/07/signalr-with-asp-net-core.html https://github.com/ ...

  6. Asp.net core 学习笔记 (授权)

    更新 : 2018-11-24 记入一些思考 asp.net core + identity 的权限是这样的 user = 1 个登入账号 role = 1 个角色 (类似于公司里的一个职位) cla ...

  7. Asp.net Core学习笔记

    之前记在github上的,现在搬运过来 变化还是很大的,感觉和Nodejs有点类似,比如中间件的使用 ,努力学习ing... 优点 不依赖IIS 开源和跨平台 中间件支持 性能优化 无所不在的依赖注入 ...

  8. ASP.NET Core 学习笔记 第三篇 依赖注入框架的使用

    前言 首先感谢小可爱门的支持,写了这个系列的第二篇后,得到了好多人的鼓励,也更加坚定我把这个系列写完的决心,也能更好的督促自己的学习,分享自己的学习成果.还记得上篇文章中最后提及到,假如服务越来越多怎 ...

  9. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

随机推荐

  1. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法

    因为从Spring Boot 1.4开始,spring boot就不支持log4j了,必须是log4j2或者logback,具体两者如何配置以及NDC的支持可以参考spring boot精华版. 这里 ...

  2. uml类图和er图中主外键的表示区别

    在er图也就是数据库中,无论是mysql/oracle都是从表引用主表的pk作为外键. 而在uml类图表示法中,他们的顺序则刚好相反,从主对象导向到子对象,如下: 主体是资金借款方,征信信息和资金借款 ...

  3. VS 域名绑定IIs 调试

    一排致敬老师傅:https://www.cnblogs.com/woxpp/p/5805624.html 问题: 域名www.jinhuang.com,网站的ip地域跳转出问题,需要测试. ①修改Ho ...

  4. linux检查系统CPU,内存,磁盘使用率

    #!/bin/bash CPU=`top -bn 1 -i -c | sed -n '3p' | awk -F ':' '{print$2}' | awk '{print$1}'` MEM=`free ...

  5. shell实现每天0点备份mysql数据库

    就两个文件, 本人学识尚浅,不解释,怕大佬喷. back.sh #/bin/bash MYSQLUSER=root MYSQLPWD=lizhenghua DATABASES=zskdb MYSQLD ...

  6. json排序 及替换在字符串中全部替换某字符串

    var roadLine = '@ViewBag.RoadLine'; var jsonRoadLine = JSON.parse(roadLine.replace(/"/g, '\&quo ...

  7. Java字节码浅析(—)

    英文原文链接,译文链接,原文作者:James Bloom,译者:有孚 明白Java代码是如何编译成字节码并在JVM上运行的非常重要,这有助于理解程序运行的时候究竟发生了些什么.理解这点不仅能搞清语言特 ...

  8. VS2012创建ATL工程及使用MFC测试COM组件

    一.创建ATL工程 1.创建ATL项目,取名为ATLMyCom 2.在ATL项目向导中,勾选[支持MFC](利用MFC测试用).[支持 COM+ 1.0],其余的选项默认,点击完成. 3.右键工程名称 ...

  9. ssh-copy-id命令解析

    ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上, ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/ ...

  10. python --- 15 装饰器

    装饰器 一.原则,目的 开闭原则: 对功能的扩展开放,对代码的修改是封闭的(不可修改的)    目的:在目标函数前或后插入一段新的代码,不改变源代码 二.装饰器的通用语法 三.多个装饰器修饰同一个函数 ...