今天推荐的是我一直以来都在关注的一个开源的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. 在CentOS 7上利用systemctl添加自定义系统服务

    每一个服务以.service结尾,一般会分为3部分:[Unit].[Service]和[Install],具体内容如下: [Unit]Description=*****After=network.ta ...

  2. .NET笔试面试题

    .NET 1.const和readonly的区别? 2.静态类和实例区别?什么时候使用? 3.接口和抽象类的区别?什么时候使用? 4.类和结构体的区别?什么时候使用? 5.文件操作 6.序列化 7.O ...

  3. linux基本命令(3)-文件目录操作指令

    1.拷贝文件 目录:cp - r /usr/xu/ /usr/liu/ 文件:cp /home/itcast/Desktop/jdk-6u24-linux-i586.bin  /usr/java/ 2 ...

  4. SSN 社会安全号码

    SSN是 Social Security Number 的缩写,译为「社会安全号码」,为美国社会安全卡(Social Security Card)上的 9 位数字.SSN 原本目的是用于追踪个人的纳税 ...

  5. Centos上传下载小工具lrzsz

    http://www.centoscn.com/image-text/install/2013/0819/1374.html

  6. poj2642 The Brick Stops Here(DP基础题)

    比基础的多一点东西的背包问题. 链接:POJ2642 大意:有N种砖,每种花费p[i],含铜量c[i],现需要用M种不同的砖融成含铜量在Cmin到Cmax之间(可等于)的砖,即这M种砖的含铜量平均值在 ...

  7. HDU4901 The Romantic Hero 计数DP

    2014多校4的1005 题目:http://acm.hdu.edu.cn/showproblem.php?pid=4901 The Romantic Hero Time Limit: 6000/30 ...

  8. 通用js类库

    /* 其它通用函数 */$(function() { // var General = function() { var _self = this; /* 写 cookie 操作 */ _self.S ...

  9. hibernate中几个接口作用

    1.Configuration 类 Configuration 类负责管理 Hibernate 的配置信息,包括数据库的URL.用户名.密码.JDBC驱动类,数据库Dialect,数据库连接池等,其加 ...

  10. [Effective JavaScript 笔记]第31条:使用Object.getPrototypeOf函数而不要使用__proto__属性

    ES5引入Object.getPrototypeOf函数作为获取对象原型的标准API,但由于之前的很多js引擎使用了一个特殊的__proto__属性来达到相同的目的.但有些浏览器并不支持这个__pro ...