【IdentityServer4】AccessToken生成、验证流程
AccessToken类型
IdentityServer4
Token有两种类型Jwt
、Reference
,默认使用 JWT
类型。在配置 Client
客户端的时候 指定Token类型。
public enum AccessTokenType{Jwt = 0,Reference = 1}
Reference Token
的特点是 Token
的有效与否是由 Token
颁发服务集中化控制的,颁发的时候会持久化 Token
,然后每次验证都需要将 Token 传递到颁发服务进行验证,是一种中心化的验证方式。JWT Token
的特点与前者相反,每个资源服务不需要每次都要都去颁发服务进行验证 Token
的有效性验证,仅仅是获取公钥用于验证签名,且该公钥获取以后可以自己缓存,持续使用,不用再去交互获得,除非数字证书发生变化。
AccessToken生成
1、Ids4的加密方式
Ids4目前使用的是RS256
非对称方式,使用私钥进行签名,然后客户端通过公钥进行验签。
Ids4默认使用临时证书来进行token的生成,使用代码 .AddDeveloperSigningCredential()
,这里会自动给生成tempkey.rsa
证书文件
在生产环境我们最好使用自己配置的证书。使用如下方式添加证书:
.AddSigningCredential(new X509Certificate2(Path.Combine(basePath,"test.pfx"),"123456"));
AccessToken验证
Jwt类型
当使用 AccessTokenType
类型为 Jwt Token
时候,就会使用 Jwt
规范来生成 Token
,签名的算法是采用 RSA
,在服务端 IdentityServer4
使用私钥对 Token
进行签名,当客户端去资源端获取资源的时候,API
端(资源服务器)收到第一个请求后去服务端获得公钥然后验签(调用/.well-known/openid-configuration/jwks
获取公钥这个过程只发生在客户端第一次请求,所以当服务端更换证书,资源端也需要重启服务)。一般开发环境使用 AddDeveloperSigningCredential 方法使用临时证书即可(先判断 tempkey.rsa 文件是否存在,如果不存在就创建一个新的文件 )。
流程:
Token签名验签需要一对私钥和公钥,不过IdentityServer
为开发者提供了一个AddDeveloperSigningCredential()
方法,它会帮我们搞定这个事,并默认存到硬盘中。当切换到生产环境时,还是得使用正儿八经的证书,更换为使用AddSigningCredential()
方法。
Refrence类型
当使用 Reference token
的时候,服务端会对 Token
进行持久化,当客户端请求资源端(API)的时候,资源端需要每次都去服务端通信去验证 Token
的合法性[/connect/introspect
],IdentityServer4.AccessTokenValidation
中间件中可以配置缓存一定的时候去验证,并且 Token 是支持撤销[/connect/revocation
]的。
token验证:
API
端(资源服务器)需要每次去访问 IdentityServer4
服务端来验证 Token
的合法性(POST /connect/introspect
),当然 API
端也可以配置一定的时间来缓存结果,以减少通信的频率。
.AddIdentityServerAuthentication(options =>
{
// base-address of your identityserver
options.Authority = "https://demo.identityserver.io";
//name of the API resource
options.ApiName = "api1";
options.ApiSecret = "secret";
options.EnableCaching = true;
options.CacheDuration = TimeSpan.FromMinutes(10); //that's the default
})