搭建IdentityServer4

  • 参考:

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中连接字符串,指向我们之前创建的数据库。启动项目,看下效果。


IdentityServer4

服务发现文档:

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


内存中的配置文件
API资源

客户端

注册内存中的配置信息

运行项目Host,启动Postman进行测试


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/

jwt.io

你可能感兴趣的:(搭建IdentityServer4)