自定义声明包含在隐式流中,但不包含在 PKCE 流中

Custom claims included in implicit flow, but not included in PKCE flow

出于某种原因,在使用授权代码流时我的令牌配置未得到遵守 (response_type=code)。 id 和 auth 令牌中缺少 organizationdisplayName

当我使用隐式授权流程 (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>

• 当您使用授权代码流时,即 response_type=代码,client_id 和授权令牌中缺少组织和显示名称,因为在授权代码流中,访问令牌通过 HTTPS SSL 和 TLS 加密的安全连接传递,因为它是由我们授权的 OAuth 提供商颁发的,因为无法直接在 URL 参数中传递访问令牌,因为 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/

原因是我有 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>