IdentityServer4
身份认证服务器(IdentityServer)
l IdentityServer:
是基于OpenID Connect协议标准的身份认证和授权程序,它实现了OpenID Connect 和OAuth2.0协议。
l OAuth2.0:
是一种授权机制,用来授权第三方应用,获取用户数据,其核心就是向第三方应用颁发令牌。
有4种授权方式:
- § 授权码(authorization-code)
- § 隐藏式(implicit)
- § 密码式(password):
- § 客户端凭证(client credentials)
不管哪一种授权方式,第三方应用申请令牌之前,都必须先到系统备案,说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。
- § 授权码(authorization-code)
这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
1.获取授权码
https://b.com/oauth/authorize?
response_type=code&
client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&
scope=read
2.使用授权码拿令牌:
https
://b
.com
/oauth
/token
?
client_id
=CLIENT_ID
&
client_secret
=CLIENT_SECRET
&
grant_type
=authorization_code
&
code
=AUTHORIZATION_CODE
&
redirect_uri
=CALLBACK_URL
3颁发令牌
{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{...}
}
二.隐藏式:令牌是直接暴露在前端的不安全。因此,只能用于一些安全要求不高的场景,并且令牌的有效期必须非常短,通常就是会话期间(session)有效,浏览器关掉,令牌就失效了。
1.授权
https
://b
.com
/oauth
/authorize
?
response_type
=token
&
client_id
=CLIENT_ID
&
redirect_uri
=CALLBACK_URL
&
scope
=read
2.颁发令牌:
https
://a
.com
/callback#token
=ACCESS_TOKEN
三.密码式:
如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)
1.请求令牌
https
://oauth
.b
.com
/token
?
grant_type
=password
&
username
=USERNAME
&
password
=PASSWORD
&
client_id
=CLIENT_ID
四.凭证式:
这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌
https
://oauth
.b
.com
/token
?
grant_type
=client_credentials
&
client_id
=CLIENT_ID
&
client_secret
=CLIENT_SECRET
更新令牌:
B 网站颁发令牌的时候,一次性颁发两个令牌,一个用于获取数据,另一个用于获取新的令牌(refresh token 字段)。令牌到期前,用户使用 refresh token 发一个请求,去更新令牌。
https
://b
.com
/oauth
/token
?
grant_type
=refresh_token
&
client_id
=CLIENT_ID
&
client_secret
=CLIENT_SECRET
&
refresh_token
=REFRESH_TOKEN
refresh_token
参数就是用于更新令牌的令牌。
OIDC对OAuth2.0主要扩展就是提供了Id token,在OAuth2.0提供的 Access Token解决第三方客户端访问受保护资源的基础上,扩展了Id token解决了客户端标识身份认证的问题,一并提供用户身份认证的信息 。
扩展了一种授权方式:
Hybrid Flow:混合Authorization Code Flow+Implici Flow。