自定义声明包含在隐式流中,但不包含在 PKCE 流中
Custom claims included in implicit flow, but not included in PKCE flow
出于某种原因,在使用授权代码流时我的令牌配置未得到遵守 (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>
• 当您使用授权代码流时,即 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?
原因是我有 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>
出于某种原因,在使用授权代码流时我的令牌配置未得到遵守 (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>
• 当您使用授权代码流时,即 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?
原因是我有 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>