授权类型是指定客户端如何与IdentityServer交互的方式。OpenID Connect和OAuth2.0规范定义了以下授权类型:

  • Implicit
  • Authorization code
  • Hybrid
  • Client credentials
  • Resource owner password
  • Device flow
  • Refresh tokens
  • Extension grants

你可以在Client的配置中用AllowedGrantTypes 来指定授权类型。

一个客户端可以指定不止一种授权类型(比如Hybrid用于以用户为中心的交互,client_credential用于服务端对服务端的交互),GrantTypes类里面有一些特有的授权类型:

Client.AllowedGrantTypes = GrantTypes.HybridAndClientCredentials;

你也可以指定一个授权类型的列表:

Client.AllowedGrantTypes =
{
GrantType.Hybrid,
GrantType.ClientCredentials,
"my_custom_grant_type"
};

如果想要通过浏览器通道传输access token,你需要显式的允许客户端做如下配置:

Client.AllowAccessTokensViaBrowser = true;

注意

处于安全的因素,不是所有的类型的组合(例如上面的那个列表)被允许的,具体看下面的解释。

本文余下部分将简要描述授权类型,以及何时使用它们。此外,还建议阅读相应的规范,以便更好地理解其中的差异。

34.1 Client credentials

对于服务和服务之间的通讯来说Client credentials是最简单的一种使用场景。这种情况下请求token的是客户端,而不是用户。

这种情况下向令牌端点(token endpoint)发送了一个令牌请求,并获得代表客户端的访问令牌。客户端通常需要使用其client id和secret对令牌端点进行身份验证。

有关如何使用它的示例,请参阅客户端凭据快速入门

34.2 Resource owner password

这种授权类型允许一个客户端代表用户向令牌端点(token endpoint)发送一个用户名和密码。这是所谓的“非交互”认证,并且通常情况下也是不推荐的。

它存在的一些理由包括一些遗留代码中或者一些集成的场景中,在这种情况下,这种授予类型是有用的,但是一般的建议是使用隐式或混合的交互流来代替用户身份验证。

查看这里可以参考一些关于这方面的参考,通过实现IResourceOwnerPasswordValidator这个接口,你可以提供一些校验username/password的代码。您可以在此处找到有关此接口的更多信息。

34.3 Implicit

隐式的授权类型对基于浏览器的应用进行了优化,用于用户身份验证(包括服务器端和JavaScript应用程序),或身份验证和访问令牌请求(JavaScript应用程序)。

在隐式流中,所有令牌都通过浏览器传输,因此不允许刷新令牌等高级功能。

快速入门显示了服务器端的web应用程序的认证,而个显示的JavaScript。

注意

对于基于JavaScript的应用程序,不再推荐使用Implicit。请使用PKCE使用授权码。

34.4 Authorization code

授权码流最初由OAuth2.0指定,并提供了一种在反向通道上检索令牌而不是浏览器前置通道的方法。它还支持客户端身份验证。

虽然这种授权类型本身是受支持的,但通常建议您将其与身份令牌结合使用,将其转换为所谓的混合流。混合流程为您提供重要的额外功能,如签名协议响应。

34.5 Hybrid

混合流是隐式和授权代码流的组合 - 它使用多种授权类型的组合,最典型的是code id_token

在混合流中,身份令牌通过浏览器通道传输,并包含签名的协议响应以及其他工件(如授权代码)的签名。这减轻了许多适用于浏览器通道的攻击。成功验证响应后,反向通道用于检索访问和刷新令牌。

这是希望检索访问令牌(也可能是刷新令牌)的本机应用程序的推荐流程,用于服务器端Web应用程序和本机桌面/移动应用程序。

有关将混合流与MVC一起使用的更多信息,请参阅快速入门。

34.6 Device flow

设备流程专为无浏览器和输入受限设备而设计,设备无法安全地捕获用户凭据。此流程将用户身份验证和同意外包给外部设备(例如智能手机)。

此流程通常由IoT设备使用,可以请求身份和API资源。

34.7 Refresh tokens

刷新令牌允许获得对API的长期访问。

您通常希望尽可能缩短访问令牌的生命周期,但同时不要一次又一次地通过对IdentityServer进行前端通道往返请求新的令牌来打扰用户。

刷新令牌允许在没有用户交互的情况下请求新的访问令牌。每次客户端刷新令牌时,都需要对IdentityServer进行(经过身份验证的)反向通道调用。这允许检查刷新令牌是否仍然有效,或者在此期间是否已被撤销。

混合,授权代码,设备流和资源所有者密码流支持刷新令牌。要请求刷新令牌,客户端需要在令牌请求中包含offline_access范围(并且必须被授权请求该范围)。

34.8 Extension grants

扩展授权允许使用新的授权类型扩展令牌端点。有关详细信息,请参阅

34.9 Incompatible grant types

禁止某些授权类型组合:

  • 混合使用隐式和授权码或混合将允许从更安全的基于代码的流降级到隐式。
  • 同样的问题也存在于允许授权码和混合

github地址

第34章 授予类型 - Identity Server 4 中文文档(v1.0.0)的更多相关文章

  1. 第62章 EntityFramework支持 - Identity Server 4 中文文档(v1.0.0)

    为IdentityServer中的配置和操作数据扩展点提供了基于EntityFramework的实现.EntityFramework的使用允许任何EF支持的数据库与此库一起使用. 这个库的仓库位于这里 ...

  2. 第36章 扩展授权 - Identity Server 4 中文文档(v1.0.0)

    OAuth 2.0为令牌端点定义了标准授权类型,例如password,authorization_code和refresh_token.扩展授权是一种添加对非标准令牌颁发方案(如令牌转换,委派或自定义 ...

  3. 第61章 IdentityServer Options - Identity Server 4 中文文档(v1.0.0)

    IssuerUri 设置将在发现文档和已颁发的JWT令牌中显示的颁发者名称.建议不要设置此属性,该属性从客户端使用的主机名中推断颁发者名称. PublicOrigin 此服务器实例的来源,例如http ...

  4. 第58章 Profile Service - Identity Server 4 中文文档(v1.0.0)

    IdentityServer通常在创建令牌或处理对userinfo或内省端点的请求时需要有关用户的身份信息.默认情况下,IdentityServer仅具有身份验证cookie中的声明,以便为此身份数据 ...

  5. 第55章 API资源 - Identity Server 4 中文文档(v1.0.0)

    此类建模API资源. Enabled 指示此资源是否已启用且可以请求.默认为true. Name API的唯一名称.此值用于内省身份验证,并将添加到传出访问令牌的受众. DisplayName 该值可 ...

  6. 第54章 身份资源 - Identity Server 4 中文文档(v1.0.0)

    此类为身份资源建模. Enabled 指示此资源是否已启用且可以请求.默认为true. Name 标识资源的唯一名称.这是客户端将用于授权请求中的scope参数的值. DisplayName 该值将用 ...

  7. 第39章 引用令牌 - Identity Server 4 中文文档(v1.0.0)

    访问令牌有两种形式 - 自包含或引用. JWT令牌将是一个自包含的访问令牌 - 它是一个带有声明和过期的受保护数据结构.一旦API了解了密钥材料,它就可以验证自包含的令牌,而无需与发行者进行通信.这使 ...

  8. 第38章 刷新令牌 - Identity Server 4 中文文档(v1.0.0)

    第38章 刷新令牌 由于访问令牌的生命周期有限,因此刷新令牌允许在没有用户交互的情况下请求新的访问令牌. 以下流程支持刷新令牌:授权代码,混合和资源所有者密码凭据流.需要明确授权客户端通过设置Allo ...

  9. 第28章 确认(Consent) - Identity Server 4 中文文档(v1.0.0)

    在授权请求期间,如果IdentityServer需要用户同意,则浏览器将被重定向到同意页面. 同意用于允许最终用户授予客户端对资源(身份或API)的访问权限.这通常仅对第三方客户端是必需的,并且可以在 ...

随机推荐

  1. lvm快照备份数据库(Mysql5.7)

    备份的目的 能够防止由于机械故障以及人为误操作带来的数据丢失,例如将数据库文件保存在了其它地方. 备份的分类 以操作过程中服务的可用性分: 冷备份:cold backup mysql服务关闭,mysq ...

  2. java代码的编译、执行过程

    Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码 ...

  3. Android进阶推荐书籍

    中级进阶推荐看一下以下这几本书 1.<Android从入门到精通(附光盘)> 明日科技 编 2.<第一行代码2 Android(第二版)> 郭霖 著 3.<Android ...

  4. Java作业十二(2017-11-13)

    /*继承与抽象类*/ package com.baidu.www; abstract class Person { private String name; private int age; publ ...

  5. 微信小程序 open-data更改样式 open-data 显示头像 圆形

    废话不多说,直接看效果: 效果一: 代码如下: <view class='zhubo'> <view class='zhuboLeft'> <view class='zh ...

  6. Java两种方法实现循环报数

    问题描述: 十个猴子围成一圈选大王,依次1-3 循环报数,报到3 的猴子被淘汰,直到最后一只猴子成为大王.问,哪只猴子最后能成为大王? 方法一:Java链表 public class TestAll ...

  7. [Swift]LeetCode350. 两个数组的交集 II | Intersection of Two Arrays II

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...

  8. [Swift]LeetCode1008. 先序遍历构造二叉树 | Construct Binary Search Tree from Preorder Traversal

    Return the root node of a binary search tree that matches the given preorder traversal. (Recall that ...

  9. 花点时间顺顺Git(上)

    花点时间顺顺Git(上) 为了让你们点进来贼努力的想了一个色彩斑斓大吉大利的标题,好,看正文 历史:Linus的作者创建了开源的Linux,02年以前代码管理都依赖手动合并,后来管理不了了,拒绝SVN ...

  10. linux各个服务器的软件自启动

    首先你需要编写一个shell脚本,也就是启动app的,当然还应该有stop的脚本 这里贴出我的,因为每个人的服务安装路劲不同,故启动不同,仅供参考.如有雷同,纯属你智障 web服务器: 应用服务器: ...