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

  • 含蓄
  • 授权码
  • 混合动力
  • 客户凭证
  • 资源所有者密码
  • 刷新令牌
  • 延期拨款

您可以通过配置上的AllowedGrantTypes属性指定客户端可以使用的授权类型Client

可以将客户端配置为使用多个授权类型(例如,用于以用户为中心的操作的混合和用于服务器到服务器通信的客户端凭证)。GrantTypes类可以用来从典型交付式的组合,以挑选:

Client.AllowedGrantTypes = GrantTypes.HybridAndClientCredentials;

您也可以手动指定授权类型列表:

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

如果要通过浏览器通道传输访问令牌,还需要在客户端配置上明确允许:

Client.AllowAccessTokensViaBrowser = true;

注意

出于安全原因,并非所有授权类型组合都是允许的。请参阅下面的更多细节。

对于其余部分,简要描述了授权类型,以及何时使用它们。还建议您另外阅读相应的规格以更好地理解差异。

客户端凭证

这是最简单的授权类型,用于服务器到服务器通信 - 始终代表客户端而不是用户请求令牌。

使用此授权类型,您可以向令牌端点发送令牌请求,并获取代表客户端的访问令牌。客户端通常必须使用其客户端ID和密钥对令牌端点进行身份验证。

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

资源所有者密码

资源所有者密码授予类型允许通过将用户的名称和密码发送到令牌端点来代表用户请求令牌。这就是所谓的“非交互式”身份验证,通常不推荐使用。

某些遗留或第一方集成方案可能有原因,其中此授权类型很有用,但一般建议使用隐式或混合的交互式流来代替用户身份验证。

有关如何使用它的示例,请参阅资源所有者密码快速入门您还需要提供用户名/密码验证的代码,可以通过实现IResourceOwnerPasswordValidator接口来提供您可以在此处找到有关此界面的更多信息

隐含

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

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

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

授权码

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

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

混合

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

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

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

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

刷新令牌

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

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

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

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

扩展授予

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

不兼容的授权类型

禁止使用某些授权类型组合:

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