以下思路参考于 IdentityServer4 源码,流程。阅读文章请 先 熟悉 OAuth 2.0, Open ID ,Open ID Connect 。本文章已申请授权骑士处理,转载请注明出处。
存储于 本机 Markdown文档。 | 待更新。
IdentityServer4是一个针对 ASP.NET Core 2.0 的OpenID Connect 和 OAuth 2.0框架。
在你的应用中,它支持以下特性:
Authentication as a Service
所有应用程序的集中登录逻辑和工作流(web,native,mobile,services),IdentityServer 是一个官方认证的OpenID Connect的实现。
Single Sign-on / Sign-out
在多个应用程序类型的登入和登出
Access Control for APIs
为不同的客户端提供api的访问令牌,e.g. server to server, web 应用,SPAs和 native .mobile apps
Federation Gateway(联合网关)
支持如Azure AD,Google,Facebook等外部的身份验证提供者,这将保护你的应用程序从如何连接到这些外部提供程序的细节。
Focus on Customization(专注于定制)
最重要的一部分--IdentityServer 的很多方面都可以定制,以满足你的需求,由于IdentityServer 是一个框架,而不是一个boxed product或者一个SaaS,所以你可以编写代码来对系统进行调整,以适应您的场景。
Mature Open Source(成熟的开源)
IdentityServer 使用了Apache 2的开源许可,允许在它上面构建商业产品,它也是.NET Foundation的一部分,提供了法律支持和治理。
Free and Commercial Support(免费和商业支持)
如果你需要帮助构建或运行您的身份平台,请让我们知道,我们有几种方法可以帮组你。
The Big Picture
大多数现代应用程序或多或少都是这样的:
最常见的互动是:
浏览器与Web 应用程序的通信
Web应用程序与Web api进行通信(有时是自己的,也有代表用户的)
基于浏览器的应用程序与web apis通信
Native applications 与 web APIs通信
基于服务器的应用程序与Web api通信
web api 与web api 进行通信(有时是自己的,有时代表用户)
通常,每个层(前端,中间层和后端)都必须保护资源,并实现身份验证/或授权 --通常是针对同一个用户存储的。
将这些基本安全功能外包给安全令牌服务,可以防止在这些应用程序和端点之间复制该功能,
对应用程序进行重构以支持安全令牌服务,这将导致以下体系和协议:
这样的设计将安全问题分为两部分:
Authentication
当应用程序需要了解当前用户的身份时,需要进行身份验证。通常,这些应用程序为了去管理数据和需要去确保这个用户能被与允许连接这些数据。最常见的例子就是web 应用程序,但是是基于native和JS的应用程序也需要去进行身份验证。
OpenID Connect是最新的三个,但它被认为是未来,因为它对现代应用最有潜力。它是为移动应用场景而建的,从开始和设计也是友好的和API。
API Access
应用程序有两种基本的方式与API进行通信。使用application identity,或者委托user’s identity。有时这两种方法需要结合使用。
OAurh2 是一种协议,允许应用程序从安全令牌服务请求访问令牌,并使用它们与api进行通信,这个委托减少了客户端应用程序和身份验证和身份验证之后的api复杂性。
OpenID Connect and OAuth 2.0 – better together
OpenID Connect 和OAuth 2.o非常相似--实际上,OpenID Connect 是OAuth2.0的一个扩展,两个基本的安全问题,身份验证和API访问,被组合成一个单一的协议--通常是对安全令牌服务进行一次单独的访问。
我们相信,在可预见的未来,OpenID Connect和OAuth2.0的结合是确保现代应用程序安全的最佳方式。身份识别是这两种协议的一种实现,它对解决当前mobile,native和web 应用程序的典型安全问题进行了高度优化。
How IdentityServer4 can help
IdentityServer 是一个中间件 ,符合规范的OpenID Connect和OAuth 2.0端点应用带任何ASP.NET Core应用程序。
通常,您构建(或重用)一个包含登录和注销页面的应用程序(取决于你的需求),把IdentityServer middleware添加到必要的协议头,因此客户端应用程序可以使用这些标准协议与之进行通信。
托管应用程序可以像您希望的那样复杂,但是我们通常建议通过只包含与身份验证相关的UI来尽可能小地被攻击。
Terminology(术语)
规范,文档和object model 使用了一些您应该知道的术语。
../_images/terminology.png
IdentityServer
IdentityServer是一个OpenID Connect 提供者 - 它实现了OpenID Connect 和 OAuth 2.0协议。
不同的文献使用不同的术语来表示相同的角色 - 你可能还会发现安全令牌服务security token service,身份提供者identity provider,授权服务器authorization server, IP-STS 等等
但是,它们都是一样的:一款向客户端提供安全令牌的软件。
IdentityServer有许多工作和特性 - 包含:
保护你的资源
通过外部扩展的identity provider或本地账户对用户进行身份验证。
提供session 管理和单点登录
管理和认证用户
向clients发出标识issue identity和访问令牌。
验证tokens
User
用户是一个使用注册客户端client访问资源的人,
Client
Client是一个软件,它从IdentityServer 请求token - 要么是访问资源(请求身份令牌identity token),要么是访问资源(请求访问令牌access token)。Client必须在请求tokens之前首先注册在IdentityServer 。
Clients的例子是web applications ,native mobile,desktop applications,SPAs,服务器进程等。
Resources
Resources是您想要用IdentityServer 保护的东西 - 你的用户身份数据或者APIs.
每个resource都有唯一的名称 - 并且 clients 使用这个名称来指定他们想要访问的资源。
Identity data 关于用户的身份信息(aka claims) ,例如姓名或电子邮件地址。
APIs APIs resources表示电子client 想要调用的功能 - 典型的模型是web api ,但也不一定。
Identity Token
identity token(身份token)允许连接 API resource。Clients请求access tokens和将他们转发到 API.
Access tokens包含了client 的信息 和用户的(如果存在)。APIS使用这些信息来授权访问他们的数据。
Supported Specifications
IdentityServer implements the following specifications:
OpenID Connect
OpenID Connect Core 1.0 (spec)OpenID Connect Discovery 1.0 (spec)OpenID Connect Session Management 1.0 - draft 28 (spec)OpenID Connect Front-Channel Logout 1.0 - draft 02 (spec)OpenID Connect Back-Channel Logout 1.0 - draft 04 (spec)
OAuth 2.0
OAuth 2.0OAuth 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)
Packaging and Builds(包装和构建)
IdentityServer 由很多nuget包组成。
IdentityServer4
包含了核心的IdentityServer object model,services和middleware。只包含对内存配置和用户存储的支持,但是你可以通过配置对其他的存储进行插件支持。这是其它的 repos 和它的packages的内容。
Quickstart UI
包含了一个简单的用户界面启动,包括登录,注销和同意页面。
Access token validation handler
ASP.NET Core 身份验证handler 用于验证tokens 在APIs. handler允许在相同的API中支持JWT 和引用tokens
ASP.NET Core Identity
ASP.NET Core Identity 集成了 package 对于 IdentityServer。package提供了一个简单的配置API来使用ASP.NET Identity 为你的IdentityServer users提供管理程序库。
EntityFramework Core
EntityFramework Core 存储实现对于EntityFramework Core。这个package提供了EntityFramework的实现对于配置和在IdentityServer操作存储。
Dev builds(开发构建)
此外,我们还向MyGet发布了 dev/interim构建版本。如果你想试一试,把下面的内容添加到你的Visual Studio中。
https://www.myget.org/F/identity/
Support and Consulting Options
We have several free and commercial support and consulting options for IdentityServer.
Free support
Free support is community-based and uses public forums
StackOverflow
There’s an ever growing community of people using IdentityServer that monitor questions on StackOverflow. If time permits, we also try to answer as many questions as possible
You can subscribe to all IdentityServer4 related questions using this feed:
https://stackoverflow.com/questions/tagged/?tagnames=identityserver4&sort=newest
Please use the IdentityServer4
tag when asking new questions
Gitter
You can chat with other IdentityServer4 users in our Gitter chat room:
https://gitter.im/IdentityServer/IdentityServer4
Reporting a bug
If you think you have found a bug or unexpected behavior, please open an issue on the Github issue tracker. We try to get back to you ASAP. Please understand that we also have day jobs, and might be too busy to reply immediately.
Also check the contribution guidelines before posting.