asp.net core IdentityServer4 概述
概览
现代应用程序看上去大都是这样的:
最常见的交互是:
- 浏览器与Web应用程序通信
- Web应用程序与Web API通信(有时是独立的,有时是代表用户的)
- 基于浏览器的应用程序与Web API通信
- 本机应用程序与Web API通信
- 基于服务器的应用程序与Web API通信
- Web API与Web API通信(有时是独立的,有时是代表用户的)
通常,每一层(前端,中间层和后端)都必须保护资源并实施身份验证和/或授权-经常针对同一用户存储。
将这些基本安全功能外包给安全令牌服务可防止在那些应用程序和端点之间重复该功能。
重组应用程序以支持安全令牌服务将导致以下体系结构和协议:
这样的设计将安全问题分为两个部分:
身份认证
当应用程序需要知道当前用户的身份时,需要进行身份验证。通常,这些应用程序代表该用户管理数据,并且需要确保该用户只能访问允许其访问的数据。最常见的示例是(经典)Web应用程序,但是本机和基于JS的应用程序也需要身份验证。
最常见的身份验证协议是SAML2p,WS-Federation和OpenID Connect-SAML2p是最受欢迎和部署最广泛的协议。
OpenID Connect是三者中的最新者,但被认为是未来,因为它在现代应用程序中具有最大的潜力。它从一开始就针对移动应用程序场景而构建,并旨在实现API友好。
API访问
应用程序有两种与API通信的基本方式-使用应用程序身份或委派用户身份。有时两种方法需要结合。
OAuth2是一种协议,允许应用程序从安全令牌服务请求访问令牌并使用它们与API通信。由于可以集中身份验证和授权,因此这种委派降低了客户端应用程序和API的复杂性。
OpenID Connect和OAuth 2.0 –更好的结合在一起
OpenID Connect和OAuth 2.0非常相似-实际上,OpenID Connect是OAuth 2.0的扩展。身份验证和API访问这两个基本的安全问题被组合成一个协议-通常只需一次往返于安全令牌服务。
我们相信OpenID Connect和OAuth 2.0的结合是在可预见的将来保护现代应用程序的最佳方法。IdentityServer4是这两个协议的实现,并且经过高度优化,可以解决当今移动,本机和Web应用程序中的典型安全问题。
IdentityServer4如何提供帮助
IdentityServer是将符合规范的OpenID Connect和OAuth 2.0端点添加到任意ASP.NET Core应用程序的中间件。
通常,您构建(或重复使用)包含登录和注销页面(可能还需要您同意-取决于您的需要)的应用程序,IdentityServer中间件会向其中添加必要的协议头,以便客户端应用程序可以与之对话使用那些标准协议。
你可以根据你的需要使用尽可能复杂的宿主应用程序。但是,为了保持受攻击面尽可能小, 我们一般建议你只将认证相关的UI包含进来。
相关术语
IdentityServer
IdentityServer 是一个 OpenID Connect 提供程序 —— 它实现了OpenID Connect 和 OAuth2 协议。
对于相同的角色,不同的文献将使用不同的术语 —— 你可能也发现了安全令牌服务(Security Token Service),身份提供程序(Identity Provider),授权服务器(Authorization Server),IP-STS 等等。但是他们都具相同的含义:软件中用来向客户端发行安全令牌的部分。
IdentityServer 包含一些职责和功能:
- 保护你的资源
- 使用本地账户存储或外部的身份提供程序来进行用户身份认证
- 提供会话管理和单点登录(Single Sign-on)
- 客户端管理和认证
- 给客户端发行身份令牌和访问令牌
- 验证令牌
用户
用户是通过已注册客户端访问相关数据的人。
客户端
客户端是软件中从 IdentityServer 请求令牌(Token)的部分 —— 既可以是为了认证一个用户(即请求的是 身份令牌),也可以是为了访问一个资源(即请求的是 访问令牌)。一个客户端必须首先注册到 IdentityServer 才能请求相关的令牌。
客户端可以是Web应用程序、移动客户端或桌面应用程序、单页面应用程序(SPA,Single Page Application)、服务器进程等等。
资源
资源就是你想要通过 IdentityServer 保护的东西 —— 既可以是你的用户的 身份信息,也可以是 API。
每个资源都有唯一的名称 —— 客户端使用这些名称来指定他们想要访问的资源。
身份数据(Identity data) 是一个用户的身份信息(又称为 claims),比如 名字(name) 和 邮箱地址(email address)。
API 资源表示的是客户端想要调用的功能 —— 通常通过 Web API 来对 API 资源建模,但这不是必须的。
身份令牌
一个身份令牌表示的是认证过程的输出。它最低限度地标识了某个用户(这也可以称为主身份信息的子集,原文:Called the sub aka subject claim),还包含了用户的认证时间和认证方式。身份令牌可以包含额外的身份数据。
访问令牌
访问令牌用来授予访问某个 API 资源的权限。客户端请求访问令牌,然后被导向 API。访问令牌包含了客户端和用户(如果提供了的话)的相关信息,API通过这些信息来给它们授予数据访问权限。