IdentityServer4 文档笔记
IdentityServer4 是 ASP.NET Core 中 OpenID Connect 与 OAuth2.0 的实现.
使用该框架可以在你的项目中实现下来特性:
将鉴权作为服务来实现 中心化登录流程, 可支持各种应用程序. 包括 web 应用, 原生应用, 移动应用, 以及服务程序. IdentityServer4 是 OpenID Connect 的官方实现.
单点登录与登出 覆盖多个应用的单点登录与登出.
对 API 的访问控制 发布支持各类客户端的访问令牌 (access token). 例如, 服务到服务, web 应用程序, SPA 应用, 原生移动应用等.
Federation Gateway 支持第三方 Identity provider. 例如 Azure Active Directory, Google, Facebook 等. 辅助你连接到上述的 provider 上, 而不用关系其中细节.
关注与自定义 最重要的一部分是他支持自定义. Ids4 是一个框架, 允许自定义.
开源
免费的支持
1. 导论
1.1 全局总览
The Big Picture
大部分应用或多或少如下所示:
主要的交互有:
- 浏览器访问应用程序.
- Web 应用连接 Web API (可能是属于自己的接口, 也可能是第三方接口).
- 基于浏览器的应用连接 Web API.
- 原生应用连接 Web API.
- 基于服务的应用连接 Web API.
- Web API 连接 Web API (可能是属于自己的接口, 也可以是第三方接口).
通常, 每一个应用层 (前端, 中间层, 或后端) 都会保护资源, 并实现鉴权 (authentication
) 与授权 (authorization
) 的行为 - 通常针对同一个用户进行存储.
将这些鉴权处理的过程外包给第三方, 可以减少应用中代码的冗余.
重构项目以支持这个架构, 之间会存在下述协议与架构:
这样的设计涉及到两个部分:
1.1.1 鉴权 (Authentication)
当应用程序需要知道当前用户的标识时就需要使用鉴权 (Authentication
) 了.
即只要当前用户是谁, 更直接的说, 就是读取用户的信息, 包括但不限于用户名, 角色等.
通常情况下, 应用程序代表用户来管理数据, 并且确保该用户只允许访问它可以被允许访问的数据. 典型的应用为传统的 Web 应用程序, 但是远程应用或基于 JS 的应用也需要使用鉴权.
常见的鉴权协议有 SAML2p
, WS-Federation
, 以及 OpenID Connect
. 其中 SAML2p
是最流行, 并且部署最为广泛.
OpenID Connect
是这三个中最年轻的. 但他被认为是最有前途的. 因为, 它最具潜力. 从开始, 它就是针对移动端进行设计的, 并且针对 WebAPI 进行设计的.
1.1.2 API 访问 (API Access)
应用程序有两个方案来与 API 进行通信. 使用应用程序标识, 或使用用户标识的代理. 有时会同时使用.
OAuth2.0 协议应用程序同安全令牌服务器请求访问令牌 (access token). 然后使用访问令牌来访问接口 API. 这个代理模型同时简化了客户端应用与 API, 因为鉴权与授权中心化了.
1.1.3 OpenID Connect 与 Oauth2.0 - 最好合并使用
OpenID Connect 与 OAuth2.0 时分类似. 实际上 OpenID Connect 是 Oauth2.0 的顶层扩展. 两个基本的安全问题, 鉴权和 API 访问合并到一个协议中. 通常往返服务器之间只有一个安全令牌.
我认为将 OpenID Connect 与 OAuth2.0 合并起来是最好的方法, 并且在移动应用中有长远的发展. IdentityServer4 就是这两个协议的合并的实现. 并且具有高度可自定义性来实现这些传统的安全问题, 包括移动端, 原生应用, 以及 Web 应用.
1.1.4 IdentityServer4 是怎么提供帮助的
IdentityServer4 是一个中间件, 它将符合 OpenID Connect 和 OAuth2.0 的端点添加到任意的 ASP.NET Core 应用中.
通常, 你可以构建 (或复用) 带有登录与登出页面的应用 (根据需要, 可能还会含有许可页面). IdentityServer 中间件将添加必须的协议头, 这样客户端应用程序就可以使用这些标准的协议了.
托管应用程序可以像您想要的那样复杂, 但我们通常建议通过只包含与身份验证相关的UI来保持攻击面尽可能小.
1.2 术语
所有的规范, 文档与模型都会使用到一些术语.
authenticate 可以翻译为验证用户
1.2.1 IdentityServer
IdentityServer 是一个 OpenID Connect 的 provider. 它是 OpenID Connect 和 OAuth2.0 协议的实现.
不同的文档中会使用不同的术语, 但表示的是一个事物. 你可能就会听过 security token service, identity provider, authorization server, IP-STS 等.
IdentityServer 有很多功能与特性 - 包括:
- 保护你的资源
- 使用本地的账户数据库, 或第三方的 provider 进行验证用户 (鉴权用户)
- 提供会话管理以及单点登录
- 办法 identity 以及 access token 给客户端
- 验证 token
1.2.2 User
用户是自然人, 它会使用已注册的客户端来访问资源.
1.2.3 客户端
客户端是一些软件, 这些软件会从 IdentityServer 请求 token. 用于验证用户(请求身份令牌)或访问资源(请求访问令牌).
客户端必须现在 IdentityServer 中注册, 才可以请求 token.
作为客户端的案例, 可以是 web 应用程序, 原生移动应用, 桌面应用, SPA, 服务处理等.
1.2.4 资源
资源是你需要 IdentityServer 保护的东西, 既可以是用户的标识数据, 也可以是 API.
每一个资源都有唯一的名字, 客户端会使用该名字来指定要访问什么资源.
用户的标识数据 (Identity data) 是标识信息, 即所谓的 claim
. 例如姓名, email 等.
API 即 API 资源, 是客户端想要调用的功能列表. 通常是 WebAPI, 但不限于此.
1.2.5 Identity Token
Identity Token 是鉴权结果的标识.
它至少包含用户的标识符(称为sub - aka subject claim)以及关于用户如何以及何时进行身份验证的信息. 它可以包含额外的标识数据.
1.2.5 Access Token
Access token 允许访问 API 资源. 客户端需要获得 access token, 然后在访问资源.
access token 中包含客户端的信息, 如果有, 可能还有用户信息. API 使用这些数据来授权可以访问的数据.
1.3 支持规范
IdentityServer 是下面规范的实现:
OpenID Connect
- OpenID Connect Core 1.0 (规范)
- OpenID Connect Discovery 1.0 (规范)
- OpenID Connect RP-Initated Logout 1.0 - draft 01 (规范)
- OpenID Connect Session Management 1.0 - draft 30 (spec)
- OpenID Connect Front-Channel Logout 1.0 - draft 04 (spec)
- OpenID Connect Back-Channel Logout 1.0 - draft 06 (spec)
OAuth2.0
- OAuth 2.0 (RFC 6749)
- OAuth 2.0 Bearer Token Usage (RFC 6750)
- OAuth 2.0 Multiple Response Types (spec)
- OAuth 2.0 Form Post Response Mode (spec)
- OAuth 2.0 Token Revocation (RFC 7009)
- OAuth 2.0 Token Introspection (RFC 7662)
- Proof Key for Code Exchange (RFC 7636)
- JSON Web Tokens for Client Authentication (RFC 7523)
- OAuth 2.0 Device Authorization Grant (RFC 8628)
- OAuth 2.0 Mutual TLS Client Authentication and Certificate-Bound Access Tokens (RFC 8705)
- JWT Secured Authorization Request (draft)
1.4 包与构建
IdentityServer 包含多个 Nuget 包.
1.4.1 IdentityServer4 主仓库
包含核心的 IdentityServer 对象模型, 服务, 以及中间件, 包括 EF 以及 ASP.NET Identity 的集成.
nuget:
1.4.2 快速开始 UI
包含简单的开始 UI, 包括登录, 登出, 以及协议页面.
1.4.3 Access Token 处理程序
ASP.NET Core authentication 处理程序, 可用于校验 API 中的 Token. 处理程序支持 JWT, 以及在同一个 API 中引用 token.
1.4.4 模板
包含 donet CLI 中使用的模板.
1.4.5 Dev build
此外, 我们将 CI 构建发布到包存储库中. 将下面 nuget.config 添加到你的项目中:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<clear />
<add key="IdentityServer CI" value="https://www.myget.org/F/identity/api/v3/index.json" />
</packageSources>
</configuration>