更新 :

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 学习笔记 SignalR

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

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

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

  4. Asp.net Core学习笔记

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

  5. Asp.net core 学习笔记 ( Data protection )

    参考 : http://www.cnblogs.com/xishuai/p/aspnet-5-identity-part-one.html http://cnblogs.com/xishuai/p/a ...

  6. Asp.net core (学习笔记 路由和语言 route & language)

    https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-2.1 https://doc ...

  7. Asp.net core 学习笔记 ( Web Api )

    asp.net core 把之前的 webapi 和 mvc 做了结合. mvc 既是 api. 但是后呢,又发现, api 确实有独到之处,所以又开了一些补助的方法. namespace Proje ...

  8. Asp.net core 学习笔记 ( IIS, static file 性能优化 )

    更新 : 2019-02-06 最后还是把 rewrite 给替换掉了. 所以 rewrite url 也不依赖 iis 了咯. refer : https://docs.microsoft.com/ ...

  9. Asp.net core 学习笔记 QR code and Barcode

    QR code 和 Barcode 经常会使用到. Java 阵营有著名的 zxing https://github.com/zxing/zxing .Net 有对接它的 port https://g ...

随机推荐

  1. AD域内DNS服务器如何解析公网域名

    原创地址:http://www.cnblogs.com/jfzhu/p/4022999.html 转载请注明出处 AD域内需要有DNS服务器,用于解析域内的计算机名,但是域内的计算如何解析公网的域名呢 ...

  2. c#中 命令copy 已退出,返回值为1

    c#中重新生成时,报错:命令"copy ...... " 已退出,返回值为1.   错误截图如下: 解决办法: 点击"项目"右键--"属性" ...

  3. css实现了hover显示title的效果

    <div data-title="hello, world">hello...</div> <style> div { position: re ...

  4. sql事务(Transaction)用法介绍及回滚实例

    sql事务(Transaction)用法介绍及回滚实例 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务, S ...

  5. POJ 3252 Round Numbers(组合)

    题目链接:http://poj.org/problem?id=3252 题意: 一个数的二进制表示中0的个数大于等于1的个数则称作Round Numbers.求区间[L,R]内的 Round Numb ...

  6. 2014年度辛星css教程夏季版第五节

    本小节我们讲解css中的”盒模型“,即”box model“,它通常用于在布局的时候使用,这个”盒模型“也有人成为”框模型“,其实原理都一样,它的大致原理是这样的,它把一个HTML元素分为了这么几个部 ...

  7. jQuery 事件 - error() 方法

    实例 如果图像不存在,则用一段预定义的文本取代它: $("img").error(function(){ $("img").replaceWith(" ...

  8. bzoj5342 CTSC2018 Day1T3 青蕈领主

    首先显然的是,题中所给出的n个区间要么互相包含,要么相离,否则一定不合法. 然后我们可以对于直接包含的关系建出一棵树,于是现在的问题就是给n个节点分配权值,使其去掉最后一个点后不存在非平凡(长度大于1 ...

  9. ArrayList和Vector区别及源码

    本文基于jdk1.7 1.ArrayList 类图来自:作者 Java3y 源码分析: 1.1 属性 1.2 构造方法 Arrays.copyOf源码: 1.3 trimToSize方法, 修改当前  ...

  10. 本地上传文件至服务器的技巧(linux文件压缩及解压文件)

    linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install ...