今天推荐的是我一直以来都在关注的一个开源的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. ios 图片尺寸

  2. map vs hash_map

    1. map, multimap, set, multiset g++ 中 map, multimap, set, multiset 由红黑树实现 map: bits/stl_map.h multim ...

  3. 10 steps to becoming the developer everyone wants

    You thought it was all about programming skills. But you were wrong! Great code is fine, yet command ...

  4. 百度编辑器Ueditor 初始化加载内容失败解决办法

    项目上有用到百度文本编辑器ueditor,在页面加载的时候初始化编辑器内容时候,使用 $.document.ready(function() { UE.getEditor('editor').setC ...

  5. 微信成为首批支持iPhone 6s /Plus 上 3D Touch 功能的 App

    2015苹果新品发布会上微信成为首批支持iPhone 6s 和 iPhone 6s Plus 上 3D Touch 功能的 App.通过 3D Touch,微信用户将可以通过更精减的操作完成基本任务, ...

  6. snoopy 强大的PHP采集类使用实例代码

    下载地址: http://www.jb51.net/codes/33397.html Snoopy的一些特点: 1抓取网页的内容 fetch 2 抓取网页的文本内容 (去除HTML标签) fetcht ...

  7. scrapy和selenium结合抓取动态网页

    1.安装python (我用的是2.7版本的) 2.安装scrapy:   详情请参考 http://blog.csdn.net/wukaibo1986/article/details/8167590 ...

  8. cobbler部署机器的默认密码

    修改cobbler的默认密码: 用 openssl 生成一串密码后加入到 cobbler 的配置文件(/etc/cobbler/settings)里,替换 default_password_crypt ...

  9. java中四种阶乘的计算

    package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...

  10. CSS用Id选择器在本页写样式

    <title>静夜思</title><style type="text/css">#red{color:#ff0000; font-weight ...