Asp.net OpenIDConnect响应类型混淆
在过去的几天里,我阅读了有关OAuth2和OpenIDConnect的所有规范,并使用ThinktectureIdentity Server实现了一个测试客户机。我还学习了几门pluralsight课程,我想我已经理解了它的主要要点。但是,我仍然对响应类型感到非常困惑 OpenIDConnect规范指定混合流响应类型是“代码”、“id_令牌”和“令牌”的组合。我理解“id_令牌”允许我们最初访问基本id信息 我还理解“代码”是指授权代码,“令牌”是指访问令牌,并且将“代码”与另外两个中的一个或两个组合会触发流,但我的理解是,您可以在授权流中将授权代码交换为访问令牌,而隐式流隐式地提供访问代码Asp.net OpenIDConnect响应类型混淆,asp.net,asp.net-web-api,oauth-2.0,openid-connect,Asp.net,Asp.net Web Api,Oauth 2.0,Openid Connect,在过去的几天里,我阅读了有关OAuth2和OpenIDConnect的所有规范,并使用ThinktectureIdentity Server实现了一个测试客户机。我还学习了几门pluralsight课程,我想我已经理解了它的主要要点。但是,我仍然对响应类型感到非常困惑 OpenIDConnect规范指定混合流响应类型是“代码”、“id_令牌”和“令牌”的组合。我理解“id_令牌”允许我们最初访问基本id信息 我还理解“代码”是指授权代码,“令牌”是指访问令牌,并且将“代码”与另外两个中的一个或两
有人能帮我澄清一下吗?您关于授权代码流和隐式流的想法是正确的。 但我认为你把混合流程复杂化了。当使用混合时,你只需简单地获得代码和id_令牌即可
之后,您可以获取代码并将其交换为访问令牌,或者直接使用id_令牌(或访问令牌)。这两种方法都有各自的缺陷,尤其是在安全性方面。您所做的以下陈述是正确的:
指授权码code
指访问令牌或(令牌
)访问令牌
- 在授权代码流中,可以切换
访问令牌的
代码
- 术语授权流并不完全正确;它的正式名称是授权代码流
- 术语访问代码不存在
- 隐式流没有授权代码(或访问代码),事实上根本不涉及允许客户端从令牌端点获取令牌的凭证(或授权),因此它的名称为
流将直接在身份验证响应中获取code-id\u令牌
和code
,但您将使用id\u令牌
从令牌端点获取code
access\u令牌
流将直接在身份验证响应中获得code-token
和code
,但您将使用access\u-token
从令牌端点在后端获得code
和另一个id\u-token
access\u-token
流将在身份验证响应中直接获得code-id\u-token-token
、code
和access\u-token
,并且您可以使用后端的id\u-token
从令牌端点获得另一个code
访问\u-token
access\u令牌
与从授权端点获取令牌不同,因为机密客户端向令牌端点(而不是授权端点)进行身份验证。因此,客户端机密部分的访问\u令牌
可能具有更多权限或更长的使用寿命
另请参阅spec邮件列表中有关此主题的短线程:要了解响应类型和授权类型之间的可能关系,请参阅
公共静态只读字典响应PetlograntTypeMapping=新字典
{
{OidcConstants.ResponseType.Code,GrantType.AuthorizationCode},
{OidcConstants.ResponseType.Token,GrantType.Implicit},
{OidcConstants.ResponseType.IdToken,GrantType.Implicit},
{OidcConstants.ResponseType.IdTokenToken,GrantType.Implicit},
{OidcConstants.ResponseType.CodeIdToken,GrantType.Hybrid},
{OidcConstants.ResponseType.CodeToken,GrantType.Hybrid},
{OidcConstants.ResponseType.CodeIdTokenToken,GrantType.Hybrid}
};
6.响应类型=代码令牌
当response_type的值为code token时,一个授权码
以及从授权端点发出的访问令牌,以及
访问令牌是从令牌端点发出的。此外,如果
包含在范围请求参数中,则从
令牌端点也是如此
授权端点和令牌端点都发出访问权限
令牌,但访问令牌的内容并不总是相同的。
关于这一点,OpenID Connect Core 1.0中的“3.3.3.8.访问令牌”
声明如下:
如果从两个授权端点返回访问令牌
和来自令牌端点,这是响应类型的情况
值code token和code id_token token,它们的值可以是
相同或不同。请注意,不同的访问令牌可能
由于不同的安全特性而返回
两个端点以及由授予的生命周期和对资源的访问
它们也可能不同
感谢您澄清术语-我仍然不确定为什么我需要从
令牌\u端点
获得第二个访问令牌
?会吗,因为我可能有一个应用程序可以同时使用这两个流?是的,如果您的应用程序能够同时使用这两个流,那么它可以获得两个访问令牌;它可能会选择这样做,因为它更信任反向通道流FrontChannel另一个原因是刷新令牌仅在后通道上发布。您永远不会使用隐式流获得刷新令牌,因此在混合流期间从授权端点返回的令牌也应该如此。您所说的“co”是正确的
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 }
};