OAuth2、OpenID Connect、IdentityServer建立Authorization Server简介

当我们在登录一些网站的时候,需要第三方的登录。比如,现在我们要登录简书https://www.jianshu.com/sign_in,我们使用微博登录,点击下方的一个微博的小按钮,就会出现这么一个地址https://api.weibo.com/oauth2/authorize?client_id=1881139527&redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&response_type=code&state=%257B%257D。乍一看,这是什么玩意啊。我们来分解下:

https://api.weibo.com/oauth2/authorize?
client_id=1881139527&
redirect_uri=http%3A%2F%2Fwww.jianshu.com%2Fusers%2Fauth%2Fweibo%2Fcallback&
response_type=code&
state=%257B%257D

现在就要引出今天的主角了,OAuth2

那什么是OAuth2呢?

https://oauth.net/2/这是官网

https://open.weibo.com/wiki/授权机制,这是微博的授权机制

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html,这是阮一峰老师写的一篇对于OAuth2的介绍。

OAuth2.0是一个委托协议,它可用让那些控制资源的人允许某个应用代表这些人,而不是假冒和模仿这喜人,这个应用从资源的所有者哪里得到授权(Authentication)和Access Token,随后就可以使用这个Access Token来访问资源。(这里提到的假冒和模仿就是指在客户端复制一份用户名和密码,从而获取响应的权限)。是关于授权(Authentication)的,客户端应用可以请求Access Token,使用Tooken就可以访问API资源了。在上述的例子中,是微博给简书授权。

让客户端应用可以代表资源所有者(通常是用户)来访问被保护的资源,如下图:

资源所有者(Resource Owner),他拥有访问API资源的权限,并且他还可以委派权限(delegate)给其他应用来访问API。资源所有者通常是可以使用浏览器的人。

被保护的资源(Protected Resource)就是资源所有者拥有权限去访问的组件,它可以是很多种形式的,但是WebApi的形式还是最常见的。

客户端(Client)应用就是代表资源所有者访问被保护资源的一个软件,注意它既不是浏览器,也不是给你钱让你开发软件的人,在OAuth2里面,它是指被保护的API资源的消费者。

授权服务器(AS)是被受保护的资源所信任的,它可以发行具有特定目的的安全凭据给客户端应用,这个凭据就叫做OAuth的Access Token。

授权,如下图

 授权种类:

  1、Authentication Code

  2、Implicit

  3、Resource Owner Password Credentials,直接使用密码凭据(用户名和密码)作为授权来获得Access Token,只有当资源所有者和客户端之间高度新人的时候并且其它授权方式不可用的时候才可以使用这种授权方式。

  4、Client Credentials,有时候,资源或者叫资源服务器,并不属于某个最终用户,也就是没有资源所有者对该资源负责,但是客户端应用肯定还是要访问这些资源,这时候就只能使用Client Credentials这种授权方式了。

其他重要角色和组件:

  1、资源所有者Resource Owner  

  2、客户端Client

  3、被保护资源 Protected Resource

  4、授权服务器Authentication Server

  5、Access Token,它是用来访问被保护资源的凭据,授权服务器只是方形Token,被保护资源验证Token,客户端队友Access Token应该是完全健忘的。

  6、Scopes,被保护资源那里的一套权限,具有叠加性

  7、Refresh Token,用来获得Access Token的凭据,客户端是用Refresh Token来请求信的Access Token

通过refresh token来取得新的access token的流程

 重要端点:

  1、授权端点(Authentication Endpoint)是用来和资源所有者交互的,资源所有者在这里进行登录(身份认证),然后通过该端点可以对客户端进行授权(Authentication Grant)。授权服务器首先要验证资源所有者的身份,但是验证的方式并不在OAuth2的协议范围内。

  2、Token端点(Token Endpoint),客户端通过向Token端点展示它的授权(Authorization Grant)或Refresh Token来获取Access Token。除了Implicit之外所有的授权类型都需要使用该端点,因为Implicit和Access Token是直接发行的。

OpenId Connect(OIDC)

身份认证和授权。OAuth2不是身份认证(Authorization)协议,OpenId Connect可以进行身份认证(Authorization)。

一个比喻,授权,就好比生牛奶(多用途原料);身份认证,就好比奶茶(一个最终产品),以牛奶为主原料。OAuth2,是生牛奶,众多web安全架构的一种多用途的基本成分。OIDC,好比奶茶,基于OAuth2的身份认证协议,添加了一些组件来提供身份认证的能力。

更高级的协议,扩展并代替了OAuth2。OpenID Connect是建立在OAuth2协议上的一个简单的身份标识层,所以OpenID Connect兼容OAuth2。使用OpenID Connect,客户端应用可以请求Identity Token,它会和Access Token一同返回给客户端应用。这个Identity Token就可以被用来登录客户端应用程序,而客户端应用还可以使用Access Token来访问API资源。UserInfo端点,(OAuth2定义了Authorization端点和Token端点)它允许客户端应用和获取用户的额外信息。定义了不同类型的应用如何从身份识别提供商(IDP)安全的获取到这些Token。

与OAuth 2.0之间的角色映射关系

  1、身份供应商(Identity Provider,IdP)

  2、依赖方(Relying Party,RP,可以理解Wie客户端)

  3、OAuth2里面可以分为两部分

    a、资源所有者/客户端应用

    b、授权服务器/被保护资源

  4、身份认证协议里也是两大不分

    a、依赖方

    b、身份提供商

  5、映射OAuth2------OIDC

   授权服务器/被保护资源------身份提供商进行映射

   资源所有者--------最终用户

   客户端应用-----依赖方(RP)

Auth 2.0 与 OIDC 角色映射

 抽象流程:

依赖方(RP)发送请求到OpenID提供商(OP,也就是身份提供商)。

OpenID提供商验证最终用户的身份,并获得了用户委派的授权

OpenID提供商返回响应,里面呆着ID Token,也通常带着Access Token

依赖方现在可以使用Access Token发送请求到用户信息的端点

用户信息端点返回用户的声明(claims,相当于是用户的信息)。

OpenId Connect身份认证流程

Authorization Code Flow: 

  在Authorization Code流程里,一个授权码(Authorization Code)会被返回给客户端,这个授权码可以被直接用来交换ID Token和Access Token。该流程也可以在客户端使用授权码兑换Access Token之前对其身份认证。但是该流程要求客户端的身份认证动作在后台使用Client 和Secret来获得Tokens,这样就不会把Tokens暴露给浏览器或者其他访问浏览器的恶意应用了。

  要求客户端应用可以安全的在它和授权服务器之间维护客户端的Secret,也就是说只适合这样的客户端应用。它还适合于长时间的访问(通过Refresh Token)。授权码来自于授权端点,而所有的Tokens都来自于Token端点。

  Authorization Code流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最红用户进行身份认证

    授权服务得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同时带着授权码

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的Body里面包含在和ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息

Implicit Flow:

  Implicit在请求Token的时候不需要明确的客户端身份认证,它使用重定向URI的方式来验证客户端的身份,因为这一点,Refresh Token也就无法使用了,这同样也不适合于长时间有效的Access Token。

  所有的Tokens都来自于授权端点,而Token端点并没有用到。

  该流程主要用于浏览器内的应用,Access Token和ID To恩一同被直接返回给客户端,因为这个原因,这些Tokens也会暴露于最终用户和跨域访问该浏览器的其他应用了。它并不适合于长时间的访问。

  Implicit流程的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的同意/授权

    授权服务器把最终用户发送客户端,同事带着ID Token,如果也请求了Access Token的话,那么Access Token也会一同返回。

    客户端验证ID Token,并获得用户的一些身份信息。

Hybrid Flow:

  Hybrid Flow是前两者的混合,在该流程里。有一些Tokens和授权码来自于授权重点,而另外一些Tokens则来自于Token端点。该流程允许客户端立即使用ID Token,并且只需要一次往返即可获得授权码。这种流程也要求客户端应用可以安全的维护Secret,它也适合于长时间的访问。

  Hybrid Flow的步骤如下:

    客户端准备身份认证请求,请求里包含所需要的参数

    客户端发送请求到授权服务器

    授权服务器对最终用户进行身份认证

    授权服务器获得最终用户的统一/授权

    授权服务器把最终用户发送回客户端,同事带着授权码,根据响应类型的不同,也考嫩恶搞带着一个躲着多个其他的参数

    客户端使用授权码向Token端点请求一个响应

    客户端接收到响应,响应的body里面包含着ID Token和Access Token

    客户端验证ID Token,并获得用户的一些身份信息。

三种流程特点的比较

 返回值类型的比较

 三种类型,根据response_type的不同,分为:

  response_type=code id_token、response_type=code token、response_type=code id_token token。

  注意:为了表明是OpenID Connect协议的请求,scope参数里必须包含OpenID。

esponse_type=code id_token

response_type=code token

response_type=code id_token token

Identity Server:

建立Identity Provider项目

dentityServer4.Templateshttps://github.com/IdentityServer/IdentityServer4.Templates

安装工具:

dotnet new -i identityserver4.templates

重置 “dotnet new” 功能列表: dotnet new --debug:reinit

模板:

dotnet new is4empty、 dotnet new is4ui 、dotnet new is4inmem 、dotnet new is4aspid、 dotnet new is4ef 、dotnet new is4admin (收费)

使用Identity Server 建立Authorization Server:https://www.cnblogs.com/cgzl/p/7780559.html

原文地址:https://www.cnblogs.com/taotaozhuanyong/p/11610063.html

时间: 2024-11-16 05:36:35

OAuth2、OpenID Connect、IdentityServer建立Authorization Server简介的相关文章

使用Identity Server 4建立Authorization Server (1)

预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 本文内容基本完全来自于Identity Server 4官方文档: https://identityserver4.readthedocs.io/ 官方文档很详细的. 使用OAuth可以更安全, 这里我们的authorization server和web api 以及网站将分别独立运行. 建立authorization server 建立asp.net core 项目使用空模板. 项目建立后, 运行

五、WebApi建立authorization server

一.服务端建立authorization server 1.安装 Install-Package identityserver4 2.编写配置类 //一.IDS4服务制定 public class Config { //1.定义API资源 public static IEnumerable<ApiResource> GetApis() //ApiResource是属于using IdentityServer4.Models;内的. { return new List<ApiResourc

使用Identity Server 4建立Authorization Server (5)

预备知识: http://www.cnblogs.com/cgzl/p/7746496.html 第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第二部分: http://www.cnblogs.com/cgzl/p/7788636.html 第三部分: http://www.cnblogs.com/cgzl/p/7793241.html 第四部分: http://www.cnblogs.com/cgzl/p/7795121.html 之前的配置

使用Identity Server 4建立Authorization Server (2)

第一部分: http://www.cnblogs.com/cgzl/p/7780559.html 第一部分主要是建立了一个简单的Identity Server. 接下来继续: 建立Web Api项目 如图可以在同一个解决方案下建立一个web api项目: (可选)然后修改webapi的launchSettings.json, 我习惯使用控制台, 所以把IISExpress相关的都删掉, 并且把端口改成5001: { "profiles": { "WebApi": {

续IDS4建立Authorization server和Client

一.准备 创建一个名为QuickstartIdentityServer的ASP.NET Core Web 空项目(asp.net core 2.2),端口5000创建一个名为Api的ASP.NET Core Web Api 项目(asp.net core 2.2),端口5001 二.定义服务端配置 1.NuGet命令行 NuGet命令行:Install-Package IdentityServer4 2.在QuickstartIdentityServer项目中添加一个Config.cs文件: u

OpenID Connect的常见问题与答案

OpenID Connect的常见问题与答案 OpenID Connect是什么,它是怎么样工作的? OpenID Connect是可互操作的身份验证协议基于OAuth 2.0规范族.它使用简单的REST / JSON消息流实现"让简单的事情变得简单和复杂的事情变为可能"的设计目标.开发者可以轻松集成.比较之前任何一种身份认证协议. OpenID Connect允许开发者验证跨网站和应用程序的用户,而无需拥有和管理密码文件.app builder,它提供了一个安全的可核查的,回答这个问

(译)OpenID Connect的常见问题与答案(二)

OpenID Connect是什么,它是怎么样工作的? OpenID Connect是可互操作的身份验证协议基于OAuth 2.0规范族.它使用简单的REST / JSON消息流实现“让简单的事情变得简单和复杂的事情变为可能”的设计目标.开发者可以轻松集成.比较之前任何一种身份认证协议. OpenID Connect允许开发者验证跨网站和应用程序的用户,而无需拥有和管理密码文件.app builder,它提供了一个安全的可核查的,回答这个问题:“当前需要身份验证的用户是使用浏览器还是本地应用 C

PHP下的Oauth2.0尝试 - OpenID Connect

OpenID Connect OpenID Connect简介 OpenID Connect是基于OAuth 2.0规范族的可互操作的身份验证协议.它使用简单的REST / JSON消息流来实现,和之前任何一种身份认证协议相比,开发者可以轻松集成.OpenID Connect允许开发者验证跨网站和应用的用户,而无需拥有和管理密码文件.OpenID Connect允许所有类型的客户,包括基于浏览器的JavaScript和本机移动应用程序,启动登录流动和接收可验证断言对登录用户的身份. OpenID

入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 MVC认证与授权(四)

本教程将搭建一个最小能够运行的IdentityServer.为简单起见,我们将identityserver和客户端放在同一Web应用程序-这可能不会是一个很现实的情况下,但可以让你不太复杂的开始. 完整的源代码可以在这里找到. Part 1 - MVC MVC认证与授权 在第一部分中我们将创建一个简单的MVC应用程序并添加认证通过identityserver它.然后,我们将有一个更仔细的看claims,claims的变化和授权. 创建一个 web application 在Visual Stud