IdentityServer是什么?

IdentityServer是一个基于.NET / Katana的框架和可托管组件,允许使用OpenID Connect和OAuth2等协议实现对现代Web应用程序和API的单点登录和访问控制。 它支持广泛的客户端,如移动,Web,SPA和桌面应用程序,并且是可扩展的,可以集成到新的和现有的体系结构中。

入门(Getting started)

大多数现代应用看起来或多或少是这样的:

appArch

最常见的互动是:

  • 浏览器与Web应用程序通信
  • Web应用程序与Web API进行通信(有时是自己的,有时代表用户)
  • 基于浏览器的应用程序与Web API通信
  • 本地应用程序与Web API进行通信
  • 基于服务器的应用程序与Web API通信
  • Web API与Web API进行通信(有时是自己的,有时代表用户)

通常,每个层(前端,中间层和后端)都必须保护资源并实施身份验证和/或授权(通常针对同一用户存储)。

将这些基本安全功能外包给安全令牌服务可以防止在这些应用程序和端点之间复制该功能。

重组应用程序以支持安全令牌服务导致以下体系结构和协议:

protocols

这样的设计将安全问题分为两部分:

认证

当应用程序需要知道当前用户的身份时,需要进行身份验证。 通常,这些应用程序代表该用户管理数据,并且需要确保该用户只能访问他被允许的数据。 最常见的例子是(经典)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的组合是在可预见的未来保护现代应用程序的最佳方法。 IdentityServer是这两个协议的实现,并且经过高度优化,可以解决当今移动,本机和Web应用程序的典型安全问题。

术语

规范,文档和对象模型使用您应该注意的某些术语。

terminology

IdentityServer

IdentityServer是一个OpenID Connect提供程序 - 它实现了OpenID Connect和OAuth 2.0协议。

不同的文献对于相同的角色使用不同的术语 - 您可能还会发现安全令牌服务,身份提供者,授权服务器,IP-STS等等。

但总而言之,它们都是一样的:一种向客户发出安全令牌的软件。

IdentityServer有许多工作和功能 - 包括:

  • 保护您的资源
  • 使用本地帐户商店或通过外部身份提供商验证用户
  • 提供会话管理和单点登录
  • 管理和验证客户端
  • 发出身份和访问令牌给客户
  • 验证令牌

用户 (User)

用户是使用注册的客户端访问资源的人。

客户端(Client)

客户端是从IdentityServer请求令牌的软件,用于验证用户(请求身份令牌)或访问资源(请求访问令牌)。 必须首先向IdentityServer注册客户端才能请求令牌。

客户端的示例是Web应用程序,本地移动或桌面应用程序,SPA,服务器进程等。

资源(Resources)

资源是您希望使用IdentityServer保护的 - 用户的身份数据或API。

每个资源都有唯一的名称 - 客户端使用此名称来指定他们想要访问的资源。

身份信息关于用户的身份信息(也称为权利要求),例如。 名称或电子邮件地址。

API资源表示客户端想要调用的功能 - 通常被建模为Web API,但不一定。

身份令牌(Identity Token)

身份令牌表示身份验证过程的结果。 它至少包含用户的标识符(称为副主题主题),以及用户如何以及何时进行身份验证的信息。 它可以包含其他身份数据。

访问令牌(Access Token)

访问令牌允许访问API资源。 客户端请求访问令牌并将其转发到API。 访问令牌包含有关客户端和用户的信息(如果存在)。 API使用该信息来授权访问其数据。