OpenIDConnect响应类型混淆

时间:2015-03-26 09:56:38

标签: asp.net asp.net-web-api oauth-2.0 openid-connect

我花了最近几天阅读有关OAuth2和OpenIDConnect的所有规范,并使用Thinktecture Identity Server实现测试客户端。我也遵循了几个复数课程,我认为理解它的主要要点。但是我仍然对响应类型非常困惑。

OpenIDConnect规范指定混合流响应类型是“code”,“id_token”和“token”的组合。我理解“id_token”允许我们最初访问基本的id信息。

我也理解代码“是指授权代码,而”令牌“是指访问令牌,并将”代码“与其他两个触发器中的一个或两个相结合,但我的理解是你交换授权代码授权流中的访问令牌,而隐式流隐式提供访问代码?

有人可以解决我的困惑吗?

4 个答案:

答案 0 :(得分:15)

您所做的以下陈述是正确的:

  • code是指授权码
  • token指的是访问令牌或(access_token
  • 授权码流程中的
  • 可以切换code
  • access_token

但是你的一些困惑可能源于术语混淆:

  • 术语授权流程并不完全正确;它的正式名称是授权代码流程
  • “访问代码”一词不存在
  • 隐式流没有授权代码(也没有访问代码)实际上没有任何凭证(或 grant )涉及允许客户端从令牌端点获取令牌的凭证,因此它是名称

正如@juanifioren所指出的,混合流动结合了一些东西:

  • code id_token流将直接在身份验证响应中获得codeid_token,但您可以使用codeaccess_token获取code token令牌端点
  • code流将直接在身份验证响应中获得access_tokencode,但您可以使用id_token获取access_token并且可能来自令牌端点的后端中的另一个code id_token token
  • code流将在身份验证响应中直接获得access_tokenid_tokencode 您可以使用{{ 1}}在后​​端从令牌端点获取另一个 access_token

从令牌端点获取access_token与从授权端点获取access_token不同,因为机密客户端向Token端点(而不是授权端点)验证自身。因此,客户机密部分的{{1}}可能具有更多权限和更长的使用寿命。

另请参阅规范邮件列表中有关此主题的简短帖子:http://lists.openid.net/pipermail/openid-specs-ab/Week-of-Mon-20150209/005229.html

答案 1 :(得分:7)

要了解响应类型和授权类型之间的可能关系,请参阅IdentityServer4\Constants.cs

public static readonly Dictionary<string, string> ResponseTypeToGrantTypeMapping = new Dictionary<string, string>
        {
            { OidcConstants.ResponseTypes.Code, GrantType.AuthorizationCode },
            { OidcConstants.ResponseTypes.Token, GrantType.Implicit },
            { OidcConstants.ResponseTypes.IdToken, GrantType.Implicit },
            { OidcConstants.ResponseTypes.IdTokenToken, GrantType.Implicit },
            { OidcConstants.ResponseTypes.CodeIdToken, GrantType.Hybrid },
            { OidcConstants.ResponseTypes.CodeToken, GrantType.Hybrid },
            { OidcConstants.ResponseTypes.CodeIdTokenToken, GrantType.Hybrid }
        };

答案 2 :(得分:0)

您对授权代码流和隐式流的想法是正确的。 但我认为你的混合流程过于复杂。使用hybrid时,你只需要获得代码和id_token。

之后,您可以获取代码并将其交换为访问令牌,或者直接使用id_token(或访问令牌)。这两种方法都有自己的缺陷,特别是在安全性方面。

答案 3 :(得分:0)

https://medium.com/@darutk/diagrams-of-all-the-openid-connect-flows-6968e3990660#9401

  

6。 response_type =代码令牌

     

当response_type的值为代码令牌时,为授权代码   和访问令牌从授权端点发出,并且   访问令牌是从令牌端点发出的。另外,如果openid   包含在范围请求参数中,从   令牌端点。

     

授权端点和令牌端点均发出访问权限   令牌,但访问令牌的内容并不总是相同。   关于此,“ 3.3.3.8。访问令牌”在OpenID Connect Core 1.0中   内容如下:

     

如果两个授权端点都返回了访问令牌   并且从令牌端点开始,这是response_type的情况   值代码令牌和代码id_token令牌,它们的值可以是   相同或不同。请注意,不同的访问令牌可能   由于不同的安全特性而被退回   两个端点,以及生命周期和对资源授予的访问权限   他们可能也不同。