- 参考:
https://www.bilibili.com/video/av22903368
准备用户相关库表
在搭建IdentityServer4之前,首先需要考虑用户库表的设计,这里直接采用 asp.net core identity 的库表。
首先要有安装MSSQL2012数据库,然后开始创建库表。用户库表可以通过在VS2017上创建项目的形式自动创建。
开启VS2017创建一个asp.net core Web应用程序(模型视图控制器),
注意点击【更改身份验证】,选择【个人用户帐号】。项目创建后修改配置文件 appsettings.json 中连接字符串:
Data Source=10.23.105.88,1433;Integrated Security=false;Initial Catalog=IdentityDB;User Id = sa;Password = password123;
运行项目,点击注册。
帐号:[email protected] ,密码 !1Demo
帐号注册成功,数据库中也相应的生成了库表。库表说明
调试IdentityServer4
官方提供了一个整合了 asp.net core identity 的IdentityServer4 Demo: https://github.com/IdentityServer/IdentityServer4.AspNetIdentity
克隆项目
git clone https://github.com/IdentityServer/IdentityServer4.AspNetIdentity
VS2017打开项目
修改Host项目中的配置文件 appsettings.json中连接字符串,指向我们之前创建的数据库。启动项目,看下效果。
服务发现文档:
https://localhost:44334/.well-known/openid-configuration
服务发现数据:
{
"issuer": "https://localhost:44334",
"jwks_uri": "https://localhost:44334/.well-known/openid-configuration/jwks",
"authorization_endpoint": "https://localhost:44334/connect/authorize",
"token_endpoint": "https://localhost:44334/connect/token",
"userinfo_endpoint": "https://localhost:44334/connect/userinfo",
"end_session_endpoint": "https://localhost:44334/connect/endsession",
"check_session_iframe": "https://localhost:44334/connect/checksession",
"revocation_endpoint": "https://localhost:44334/connect/revocation",
"introspection_endpoint": "https://localhost:44334/connect/introspect",
"device_authorization_endpoint": "https://localhost:44334/connect/deviceauthorization",
"frontchannel_logout_supported": true,
"frontchannel_logout_session_supported": true,
"backchannel_logout_supported": true,
"backchannel_logout_session_supported": true,
"scopes_supported": ["openid", "profile", "email", "custom.profile", "api1", "api2.full_access", "api2.read_only", "offline_access"],
"claims_supported": ["sub", "name", "family_name", "given_name", "middle_name", "nickname", "preferred_username", "profile", "picture", "website", "gender", "birthdate", "zoneinfo", "locale", "updated_at", "email", "email_verified", "location"],
"grant_types_supported": ["authorization_code", "client_credentials", "refresh_token", "implicit", "password", "urn:ietf:params:oauth:grant-type:device_code"],
"response_types_supported": ["code", "token", "id_token", "id_token token", "code id_token", "code token", "code id_token token"],
"response_modes_supported": ["form_post", "query", "fragment"],
"token_endpoint_auth_methods_supported": ["client_secret_basic", "client_secret_post"],
"subject_types_supported": ["public"],
"id_token_signing_alg_values_supported": ["RS256"],
"code_challenge_methods_supported": ["plain", "S256"]
}
IdentityServer4服务调用
上面已经能看到服务发现暴露出来的接口地址,但是没有文档还是不知道如何调用。先看下官方文档:docs.identityserver.io 。
首先来了解下 token endpoint:
"token_endpoint": "https://localhost:44334/connect/token",
Token节点服务 是采用编程的方式获得Token. 支持 password, authorization_code, client_credentials, refresh_token 等多种授权类型。
先来个授权方式为: client_credentials 的例子,该授权方式适合与没有用户参与的场景,无需用户输入帐号密码,比如编写了一个手机APP用于调用短信服务,手机APP是客户端,短信服务是被调用的服务,也可称之为资源服务,IdentityServer4用于向客户端颁发令牌(Token),手机APP发送HTTP请求时需要携带Token,短信服务接收到调用请求首先校验Token是否有效。
在继续往下讲之前,先了解两个概念:
- Client : 在IdentityServer4配置的白名单,这样IdentityServer4才知道那些客户端允许访问它。
- Scope 和 Resource
Scope被构建为资源,只不过它是Resource的子集。
Resource 可划分为 IdentityResource、APIResource
在 https://docs.identityserver.io 输入关键字查询
在调用接口之前,需要配置下Client、和 Resource
运行项目Host,启动Postman进行测试
POST /connect/token HTTP/1.1
Host: localhost:44334
Cache-Control: no-cache
Postman-Token: 0d1877f4-5128-8457-f429-5b912a0a916e
Content-Type: application/x-www-form-urlencoded
client_id=oauthClient_MobileApp&client_secret=superSecretPassword&grant_type=client_credentials&scope=smsAPI.send
返回数据
{
"access_token": "eyJhbGciOiJSUzI1NiIsImtpZCI6ImQxMjcxNDRlNWRmN2JlNzU4OTA1OWY3YmI3OTY2NWRlIiwidHlwIjoiSldUIn0.eyJuYmYiOjE1NDY1MDcxNTEsImV4cCI6MTU0NjUxMDc1MSwiaXNzIjoiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMzQiLCJhdWQiOlsiaHR0cHM6Ly9sb2NhbGhvc3Q6NDQzMzQvcmVzb3VyY2VzIiwic21zQVBJIl0sImNsaWVudF9pZCI6Im9hdXRoQ2xpZW50X01vYmlsZUFwcCIsInNjb3BlIjpbInNtc0FQSS5zZW5kIl19.IHABbOWAHB864Ts7Ny5w6FSqUr_GW-R8q8otrdNsW08JGsIj0NImWk5hwfcU2Ycg3rcmuVCDSmYqc9f4wQbTwbpAvdalpQ6lAApnD7XODltKXZwF4zAI6Dei3NRs_-tMh5LqwT2zYJICYLDq26Hwyw3Jxh2l88xsMBxFs_xowwjmB7HAl-w_ks3vsHb8RqMZm9VPyFfsWTxhPDfvFHoRaDOtO_IUmr-CxrMebOyyqniVcmtXEW5LIpcnFZg-nGspGd0BBfnYVdCjR6DTNviGgvzDkJ6oikikM6DhBVG7DXC_sYT6Lbgh8HAsgzK062YVNP4wVjYX6EPDgH-PLoZQNA",
"expires_in": 3600,
"token_type": "Bearer"
}
返回的access_token 是JWT格式,解码才能阅读,这里推荐一个在线JWT解码的网站 https://jwt.io/