一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3

今天推荐的是我一直以来都在关注的一个开源的OpenID Connect/OAuth 2.0服务框架——IdentityServer3。其支持完整的OpenID Connect/OAuth 2.0标准,使用它就能够轻易地搭建一个单点登陆服务器。前端

说是一直关注,是由于1年前,要为一个平台搭建一个OAuth 2.0服务器,当时因为IdentityServer3还处于开发阶段,核心还不稳定,扩展功能也不完备。无奈只好熟读OAuth 2.0的规范,并根据www.asp.net网站上的一个简单示例本身实现了一个。不过如今好了,IdentityServer3在今年初正式发布稳定的1.0版本。注:IdentityServer3的开发商以前就有IdentityServer2的产品,不过是IdentityServer3基于微软最新的ASP.NET技术(好比OWIN等思想),以中间件的形式出现,更具扩展性。git

为何会出现IdentityServer3这样的框架呢?现代应用程序或多或少都是以下这样的架构:github

appArch

在这种状况下,前端、中间层和后端都须要进行验证和受权来保护资源,因此不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能。为了解决这样的问题,一般就会致使以下安全架构:后端

protocols

上图实际上是把整个安全问题分解为两个方面:验证和API访问。安全

所谓验证,就是应用程序须要知道当前用户是谁。一般应用程序都会管理用户信息,并表明用户来访问用户被受权的资源。这对于典型的Web应用程序很常见,可是对于原生应用程序或基于JS的应用程序也是须要验证。因此业界就制定了各类各样的通用验证协议:SAML2p、WS-Federation和OpenID Connect。SAML2p以前运用的比较普遍,不过做为后起之秀的OpenID Connect(其本质是基于OAuth 2.0扩展而来)对现代的应用程序(尤为移动应用)而言更加适合。服务器

对于API访问。应用程序有两种方式来和API进行通讯:使用应用程序本身的标识,或者表明用户使用用户的标识。OAuth2协议就容许应用程序先从安全令牌服务哪里请求一个访问令牌,而后随后用这个令牌来和API进行通讯(API会访问令牌服务器来验证访问者的令牌是否有效)。这就下降了客户应用程序和API之间的复杂度,由于验证和受权都被中心化了。架构

因为OpenID Connect和OAuth 2.0很是相似,因此IdentityServer3的目标就是同时支持二者。其支持以下的标准:app

  • OpenID Connect Core 1.0:basic, implicit 和 hybrid flows
  • OpenID Connect Discovery 1.0
  • OpenID Connect Session Management 1.0 - draft 22
  • OAuth 2.0:authorization code, implicit, resource owner password credentials and client credentials grant
  • OAuth 2.0 Bearer Token Usage
  • OAuth 2.0 Multiple Response Types
  • OAuth 2.0 Form Post Response Mode
  • OAuth 2.0 Token Revocation

IdentityServer3做为一个框架,具备不少扩展点(见官方文档Service Factory章节),也附带了不少扩展包:框架

  • 核心包:定义核心的对象模型,服务实现和服务器实现。内置了简单的用于测试的一些内存配置和存储实现。
  • 配置存储包:保存配置信息(clients和scopes),有EF和MongoDb可选。
  • 用户存储包:保存用户标识,有MembershipReboot和ASP.NET Identity可选。
  • 其余插件包:WS-Federation协议支持,访问令牌验证扩展
  • 第三方扩展包:好比本地化扩展等

最后想谈谈咱们是否应该把这样的框架用于咱们产品(尤为在比较关键的安全相关功能)中,也便是否应该“重复制造轮子”的问题。asp.net

在我看来,“咱们能够重复创造本身的汽车,可是绝对不要重复制造轮子”。尤为对于初创的小团队更是如此,小团队应该把精力用于快速验证业务可行性上。首先,你没法保证在制造轮子这件事情上比其余人(好比IdentityServer3的开发者一直都是作验证框架和服务器的)更专业;其次,你制造的轮子维护性确定比现成的轮子更难(除非你打算自造轮子的缘由就是有私心让别人没法接手),也比现成的轮子学习成本更难(团队其余成员没法快速地基于现有文档快速入手);最后,现成的轮子就算有欠缺,那么正确的态度是参与开源项目来完善它促进社区发展,而不是因噎废食。

“阅读原文”是IdentityServer3的官方文档目录。能够先通读文档后,来判断是否用于本身的产品。

原文地址:http://identityserver.github.io/Documentation/docs/

相关文章
相关标签/搜索