Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例



Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例


Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

创建项目

 

dotnet new -i IdentityServer4.Templates


Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
多出来的这些模板
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
adminUI用来测试,想要用再生产环境,需要交钱
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
结合core的 Identity来使用
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
使用EF core把一些数据持久化到数据库里了
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
内存来存储信息
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

创建项目

创建一个内存里的项目叫做 Idp
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
VS打开项目
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
直接运行:
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

这里看起来有点乱,这里显示注释掉
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
把上面这三被注释的代码放开注释:
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这里添加用户,添加了一个测试用户
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
查看TestUser的源码
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例


他是在代码里写死了两个用户;
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
往内存里添加 客户端应用:
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
查看GetClients()这个方法的源码
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

credential 凭证

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例



Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例


Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
授权类型是简化模式
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
再看这两行代码:
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
进去看源码:
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
表示的是Identity资源
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Identity provider这个服务器上,它有一些用户的身份认证信息,这些信息可以看做一种被保护的资源。只不过这个资源和Identity Server是在一起的
其他的APi资源没有和Identity在一起。
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
相当于这里的Identity data 也相当于是一种资源,也是被保护的
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
目前这些都是写死在代码里 ,加载到内存里的。如果使用EFCode的模板,这些东西都可以存到数据库里。
比较大的应用通常都是存到数据库里

OAth的授权方式,前面四个可以用代码来实验
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

先从简单的开始讲,讲第四个 Client Credentials:客户端凭证,。然后再讲Password的例子

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
把一些没用的代码删除掉,。只保留一个Client然后进行修改
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

这里的api1先去掉,。不让它访问这个资源
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
把这个程序运行起来就可以不用管了。然后创建一个控制台应用
它作为Identity的客户端应用,
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
需要安装一个库
https://identityserver4.readthedocs.io/en/latest/quickstarts/1_client_credentials.html

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

包含了一个Client libiary,可以使用discovery endpoint.
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
discovery endpoint里面有什么东西呢?点击这个运行起来的Identity4的例子页面
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Task.Run的写法 需要手动捕获异常

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
C#7.1以后还有一种简便的方法:
这么写报错,然后查看错误
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
项目文件添加这句话

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这个时候错误就没有了。
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
如果报错就输出异常
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

因为使用的是ClientCrenditals客户端凭据的方式,就需要提供这个凭据。就是加密用的这个字符串
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这俩都是扩展方法,是刚才装的Identity Model库里面提供的
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
方法里面需要一个参数ClientCrdentialsTokenRequest,这里面需要设置一些值
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
加断点进行调试
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
错误类型
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
修改为正确的Secret
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这次的错误信息是 invalid_scope
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这是因为服务端的Scope是空的
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
把服务端的Scope修改为api1
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
客户端也改成api1。这样就成功访问到了。
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

这是AccessToken
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

访问API


有了Access Token 就可以Call APi了。但是我们还有API资源。Identity Server 4上有一部分身份认证的资源。我们就先访问这一部分资源
服务端需要配置一下,目前只允许访问了api1资源,但是api1还不存在
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

IdentityResource里面分成了几块。点一下出来这些这5个
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这里定义资源,只定义了两个
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
设置允许访问OpenId,这里就设置了允许访问的两个资源,一个是api1 一个是身份证资源里面的openId这个Scope
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
然后运行服务端

客户端的修改:这里也加上openid都是小写?Scope之间用空格分开
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
为什么都是小写的呢 我们可以在服务端的代码里面F12进去看源码
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

测试

首先服务端这么设置
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
客户端这么设置
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
 
测试;请求失败了
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

重新。服务端加上openid
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
客户端也加上openid,运行后还是错误的,这是为什么呢
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
clientCrdentails不代表任何用户,而我这里却想访问身份认证的资源,身份认证资源就是对应着用户了。所以说这种访问是合理的

建立APi1资源

使用VScode建立的一个新项目
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

返回用户的Claims
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
官方文档的代码直接贴进来
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
这里一定要写对了api1

Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
需要身份证,然后需要使用mvc
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
端口改成5001
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例
VSCode运行程序
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

设置控制台的地址
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

然后再运行控制台应用
断点就走到了 VScode的程序
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例


Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例

控制台访问成功打印 输出的结果。从api获取的数据
Identity Server 4 原理和实战(完结)_建立Identity Server 4项目,Client Credentials 授权实例





 

上一篇:Identity Server 4 原理和实战(完结)_Resource Owner Password Credentials 授权实例


下一篇:关于杭电2029题Identity Card不能AC的疑惑