自定义声明包含在隐式流中,但不包含在 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 令牌中都缺少 organizationdisplayName

当我使用隐式授权流 (response_type=id_token) 时,它按预期工作(organizationdisplayName 存在于 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:如何在客户端凭证流中添加自定义声明数据

logoutid 在身份 server4 的隐式流中不可用

SPA 如何在 OAuth2 隐式流中提取访问令牌

在 OAuth 2.0 隐式流中验证​​ nonce 的位置?

我们真的需要在 OIDC 的隐式流中使用 id_token 吗?

如何生成包含一些自定义声明的 JWT 访问令牌?