今天推荐的是我一直以来都在关注的一个开源的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等思想),以中间件的形式出现,更具扩展性。

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

在这种情况下,前端、中间层和后端都需要进行验证和授权来保护资源,所以不能仅仅在业务逻辑层或者服务接口层来实现基础的安全功能。为了解决这样的问题,通常就会导致如下安全架构:

上图其实是把整个安全问题分解为两个方面:验证和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的目标就是同时支持两者。其支持如下的标准:

  • 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协议支持,访问令牌验证扩展
  • 第三方扩展包:比如本地化扩展等

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

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

“阅读原文”是IdentityServer3的官方文档目录。可以先通读文档后,来判断是否用于自己的产品。

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

一个功能完备的.NET开源OpenID Connect/OAuth 2.0框架——IdentityServer3的更多相关文章

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. OpenID Connect Core 1.0(一)介绍

    IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...

  3. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍 (一)

    现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...

  4. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 术语(二)

    你应该知道的在文档和对象模型中使用一些特定的术语: OpenID Connect Provider (OP) 授权服务器 Thinktecture IdentityServer v3 是一个.NET ...

  5. .NET开源OpenID和OAuth解决方案Thinktecture IdentityServer

    现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...

  6. OpenID Connect Core 1.0(九)声明(Claims)

    5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...

  7. OpenID Connect Core 1.0(四)使用授权码流验证(上)

    3.1 使用授权码流验证(Authentication using the Authorization Code Flow) 本节描述如何使用授权码流执行验证.当使用授权码流时,会从令牌终结点返回的所 ...

  8. OpenID Connect Core 1.0(六)使用隐式验证流

    3.2 使用隐式验证流(Authentication using the Implicit Flow) 本节描述如何使用隐式流程执行验证.使用隐式流程时,所有令牌从授权终结点返回:不使用令牌终结点返回 ...

  9. OpenID Connect Core 1.0(五)使用授权码流验证(下)

    3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...

随机推荐

  1. nginx 启动/停止/重启 BAT

    cls @ECHO OFF SET NGINX_PATH=D: SET NGINX_DIR=D:\Hack\nginx\color 0a TITLE Nginx 管理程序 Power By AntsG ...

  2. Linux之入侵痕迹清理总结

    rm -f -r /var/log/*rm .bash_historyrm recently_used

  3. powerdesigner设置表主键列为自动增长。

    powerdesigner 版本12.5 创建表就不说了.下面开始介绍设置自动增长列. 1 在表视图的列上创建.双击表视图,打开table properties ———>columens ,双击 ...

  4. 类型安全且自动管理内存的返回 std::string 的 sprintf 实现

    在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...

  5. UVa12726 one Friend at a Time (位 广搜)

    题目链接:UVa12726 是个PDF,不好复制进来. 大意:有个人要追个妹子,想加妹子QQ,但是不知道谁规定的,玩QQ的人要加好友必须先要有至少k个共同好友.共有N个人玩QQ,编号为1到N,1是男主 ...

  6. Linux简单的常用命令——纯手打(慢慢积累)

    ==============linux下快捷键==================ctrl+insert 复制shift +insert 粘贴 输入文件名的前三个字母,按tab键自动补全文件名 在vi ...

  7. Linux中常用的查看系统信息的命令

    导读 Linux是一个神奇而又高效的操作系统,学完Linux对Linux系统有一个熟悉的了解后,你需要了解下这些实用的查看系统信息的命令. 查看系统版本命令 uname 谈到系统版本就一定会想到una ...

  8. 搭建DNS服务器

    导读 Linux下架设DNS服务器通常是使用Bind程序来实现的.Bind是一款实现DNS服务器的开放源码的软件.DNS即域名系统,主要功能是将人们易于记忆的Domain Name(域名)与不易记忆的 ...

  9. 91SDK接入及游戏发布、更新指南

    原地址:http://bbs.18183.com/thread-99382-1-1.html本帖最后由 啊,将进酒 于 2014-4-17 10:23 编辑 1.联系91的商务人员建讨论组或者厂商建Q ...

  10. cocos2d回忆

    凭借自己的回忆想想看自己都学到了那些知识,这是小学的时候当初中老师的外公给我说的,现在想想,CCDirector,CCNode,CCScene,CCSprite这几个类,然后是坐标,锚点,CCNode ...