自定义声明包含在隐式流中,但不包含在 PKCE 流中
Posted
技术标签:
【中文标题】自定义声明包含在隐式流中,但不包含在 PKCE 流中【英文标题】:Custom claims included in implicit flow, but not included in PKCE flow 【发布时间】:2021-12-07 11:40:56 【问题描述】:由于某种原因,我的令牌配置在使用授权代码流 (response_type=code
) 时不受尊重。 id 和 auth 令牌中都缺少 organization
和 displayName
。
当我使用隐式授权流 (response_type=id_token
) 时,它按预期工作(organization
和 displayName
存在于 id 令牌中)。
配置如下。是什么原因?
<UserJourneys>
<UserJourney Id="DefaultSignin">
<OrchestrationSteps>
<OrchestrationStep Order="5" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
</UserJourneys>
<RelyingParty>
<DefaultUserJourney ReferenceId="DefaultSignin" />
<TechnicalProfile Id="JWTSignin">
<DisplayName>JWT Sign In</DisplayName>
<Protocol Name="OpenIdConnect" />
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="sub" />
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="organization" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
【问题讨论】:
【参考方案1】:原因是我有Protocol=None
,我应该有Protocol=OpenIdConnect
两件奇怪的事:
那为什么它完全适用于隐式流呢? 我确定这不是我发明的,它必须来自“自定义策略启动包”之一或其他 MSFT 示例 <TechnicalProfiles>
<TechnicalProfile Id="JwtIssuer">
<DisplayName>JSON Web Token Issuer</DisplayName>
- <Protocol Name="None" />
+ <Protocol Name="OpenIdConnect" />
<OutputTokenFormat>JWT</OutputTokenFormat>
<Metadata>
<Item Key="client_id">service:te</Item>
【讨论】:
【参考方案2】:• 当您使用授权代码流(即 response_type=code)时,client_id 和授权令牌中缺少组织和显示名称,因为在授权代码流中,访问令牌通过 HTTPS SSL 的安全连接传递和 TLS 加密,因为它由 OAuth 提供者发布,这是我们的一项强制规定,因为 URL 参数是 HTTP 请求的一部分,因此不可能直接在 URL 参数中传递访问令牌,而 HTTP 请求又可能成为中间人攻击。因此,当您使用授权码流传递令牌时,提供了一个中介一次性“授权码”,只有合法的接收者才能交换(因为您需要客户端密码),并且该代码将是对于通过未加密交易拦截请求的潜在黑客毫无用处(因为他们不知道客户端密码)。
• 同样,在隐式流中,与授权令牌相关的通信不太安全,因为可能存在潜在的攻击媒介,例如通过劫持客户端网站的 IP 地址在重定向时欺骗域,因为隐式流中的访问令牌被传递直接作为不属于 URL 参数的一部分的哈希片段,尽管它们可以通过在浏览器的客户端上运行 java 脚本来读取,因此您可以通过隐式流访问令牌哈希来读取颁发者的数据,而在授权码流中,要读取的数据旨在由拥有 HTTPS SSL 连接证书的私钥的客户端读取,因为即使您访问令牌,它也受到授权码的保护,该授权码应该由客户端 ID 解密/client 密码,然后仅通过 HTTPS SSL 连接解密。
• 因此,详细信息不会显示在授权代码流中,因为令牌在中间被截获,其中它用于授权客户端通过 HTTPS 的访问连接。
请找到以下链接以获取更多信息:-
Why is there an "Authorization Code" flow in OAuth2 when "Implicit" flow works so well?
https://aaronparecki.com/oauth-2-simplified/
【讨论】:
对不起,我无法理解你的 100 字句子,我认为它们甚至在语法上都不正确(很难说,我中途迷路了)。无论如何,您的答案完全没有抓住重点以上是关于自定义声明包含在隐式流中,但不包含在 PKCE 流中的主要内容,如果未能解决你的问题,请参考以下文章
OpenID Connect:如何在客户端凭证流中添加自定义声明数据
在 OAuth 2.0 隐式流中验证 nonce 的位置?