一个功能完备的.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等思想),以中间件的形式出现,更具扩展性。
为什么会出现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的更多相关文章
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- OpenID Connect Core 1.0(一)介绍
IdentityServer4是基于OpenID Connect and OAuth 2.0框架,OpenID Connect Core 1.0是IdentityServer4最重要的文档 By 道法 ...
- 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍 (一)
现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...
- 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 术语(二)
你应该知道的在文档和对象模型中使用一些特定的术语: OpenID Connect Provider (OP) 授权服务器 Thinktecture IdentityServer v3 是一个.NET ...
- .NET开源OpenID和OAuth解决方案Thinktecture IdentityServer
现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...
- OpenID Connect Core 1.0(九)声明(Claims)
5 声明(Claims) 这一节说明客户端如何获取关于终端用户声明和验证事件.它还定义了一组标准的基本声明配置.预定义一组可请求的声明,使用特定的scope值或能用于请求参数中的个人声明.声明可以直接 ...
- OpenID Connect Core 1.0(四)使用授权码流验证(上)
3.1 使用授权码流验证(Authentication using the Authorization Code Flow) 本节描述如何使用授权码流执行验证.当使用授权码流时,会从令牌终结点返回的所 ...
- OpenID Connect Core 1.0(六)使用隐式验证流
3.2 使用隐式验证流(Authentication using the Implicit Flow) 本节描述如何使用隐式流程执行验证.使用隐式流程时,所有令牌从授权终结点返回:不使用令牌终结点返回 ...
- OpenID Connect Core 1.0(五)使用授权码流验证(下)
3.1.2.6 验证错误响应(Authentication Error Response) 验证错误响应是一个OAuth 2.0授权错误响应消息,是RP发送授权请求的消息,由OP授权终结点的响应返回. ...
随机推荐
- PHP中的替代语法(转)
我们经常在wordpress一类博客程序的模板里面看到很多奇怪的PHP语法,比如: <?php if(empty($GET_['a'])): ?> <font color=" ...
- spring mvc静态资源文件的引用
在页面的<title>下 <link rel="stylesheet" href="<%=request.getContextPath()%> ...
- 编译安装apache-2.4.18
apache安装时, 必须要apr和apr-util, 这两个包是必须的 当下载apache的版本过高, 如: apache-2.4.18, 那么要求的apr或apu=apr-util版本将至少在1. ...
- 给setTimeout和setIntreval函数添加回调参数
setTimeout和setInterval是两个很常见的计时函数.在以前,他们只接收两个参数,我们无法直接向他们的回调函数中添加参数,如果需要实现添加多个参数,可以在外层多嵌一层来实现类似的功能.现 ...
- docker commit容器
docker commit 容器ID 镜象REPOSITORY 镜象TAG 如docker commit 52b41c68ac7b registry.lenovows.com:5000/video-a ...
- java笔记--策略模式和简单工厂模式
策略模式: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/3884781.html "谢谢-- 为什么使用:策略模式主要用于 ...
- [Effective JavaScript 笔记]第40条:避免继承标准类
ECMAScript标准库里配备了许多重要的类,如Array,function,以及Date等.扩展这些类生成子类可以方便完成很多工作,但它们的定义具有很多特殊的行为,所以很难写出行为正确的类. Ar ...
- 即时聊天 / XMPP
MQTT是第二个即时聊天协议(了解) 5.即时通讯 即时通讯网上有第三方的解决方案,比如环信,融云等.我们是自己搭的xmpp服务器,服务器使用的tigase,之前写过相关的博客,自己去年也做了对应的w ...
- editorial-render A
PROBLEM LINK: PracticeContest Author: adminTester: Kevin AtienzaEditorialist: Ajay K. VermaRussian T ...
- 【js】将table的每个td的内容自动赋值给其title属性
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...