Azure B2C - 将查询参数接受到 OAuth2 JWT
Azure B2C - Accept query params into OAuth2 JWT
我很好奇在通过 Azure 请求 OAuth2 令牌时是否可以读取查询参数?
本质上,当使用我创建的策略进行测试调用时,我希望从调用中读取额外的查询参数,并且编排(用户旅程)步骤应该读取这些值并将该值注入到自定义声明(用于 JWT 或 ID 令牌)。
我从下面的链接知道它可能*可以使用 Azure B2C 服务?但是我找不到任何好的具体例子。
Sign-up policy - Set user attributes through code
Add Custom Attribute Not Used in Sign-Up nor Edit Policy
然后我继续尝试了一堆配置,但是可供选择的选项太多了,我不知道该选择哪个。此外,我还没有找到任何描述配置这些策略时使用的选项的 Azure 文档。无论如何,这就是我所拥有的。
我从 here. I got this Github link from this Azure doc 下载了 TrustFrameworkBase.xml 和 TrustFrameworkExtensions.xml,我还按照设置策略密钥的步骤进行操作,并添加了具有委派权限的应用程序注册。对于我的信赖方配置,我只是通过 Azure B2C 门户制定了一个自定义策略,并将其下载为起点,以探索它在基本形式中的样子。
这是我在 ClaimsSchema 标签内添加到基本策略的自定义声明。 extension_Test 是我想从查询参数中注入值的声明:
<ClaimType Id="extension_Test">
<DisplayName>Test value</DisplayName>
<DataType>string</DataType>
<DefaultPartnerClaimTypes>
<Protocol Name="OAuth2" PartnerClaimType="extension_Test" />
<Protocol Name="OpenIdConnect" PartnerClaimType="extension_Test" />
</DefaultPartnerClaimTypes>
<UserInputType>Readonly</UserInputType>
</ClaimType>
</ClaimsSchema>
在相同的基本策略中,这是我为登录添加的用户旅程:
<UserJourney Id="SignIn">
<OrchestrationSteps>
<OrchestrationSteps>
<!-- The following orchestration step is always executed. -->
<OrchestrationStep Order="1" Type="ClaimsProviderSelection" ContentDefinitionReferenceId="api.idpselection.signupsignin">
<ClaimsProviderSelections>
<ClaimsProviderSelection TargetClaimsExchangeId="LocalAccountRegistrationExchange" />
</ClaimsProviderSelections>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="LocalAccountRegistrationExchange" TechnicalProfileReferenceId="LocalAccount-Registration-VerifiedEmail" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
这是我的依赖配置XML:
<RelyingParty>
<DefaultUserJourney ReferenceId="SignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_Test" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="extension_Test" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
我认为按顺序上传了基础、扩展和 RP 策略 XML 文件。我发送的 GET 请求如下所示(来自自定义策略的 "Run now" 按钮):
https://login.microsoftonline.com/<TENANT>/oauth2/v2.0/authorize?p=B2C_1A_test&client_id=<TENANTID>&nonce=defaultNonce&redirect_uri=http%3A%2F%2Flocalhost%2Fredirect&scope=openid&response_type=id_token&prompt=login&extension_Test=aaa
任何帮助将不胜感激,谢谢!或者 Azure 文档解释了这些配置文件中的更多选项——例如 CpimIssuerTechnicalProfileReferenceId="JwtIssuer" 是什么意思?或者 AzureFunction-WrapWebHook 是什么意思?
你很接近。
输入旅程声明,然后在此旅程中使用它(例如先决条件或存储)以及从旅程中输出它的端到端示例,可以在 this "Implementing an invitation flow" document(我是作者)。
高级解决方案是:
1) 在设计时,使用输入声明配置依赖方策略。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<InputTokenFormat>JWT</InputTokenFormat>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_MySharedSecret" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_Test" />
</InputClaims>
<OutputClaims>
...
<OutputClaim ClaimTypeReferenceId="extension_Test" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
您必须创建一个策略密钥(在上面的示例中,它被称为 "MySharedSecret",但它可以被称为任何东西)包含调用此策略的应用程序已知的共享秘密(其中此应用程序的客户端机密可以是此共享机密)。
2) 在运行时,创建一个包含输入声明的自发布 JWT,使用共享密钥对该 JWT 进行签名,然后使用 "client_assertion_type" 和 [=34= 将 JWT 添加到身份验证请求中]参数。
可在 the Wingtip sample 中找到此代码示例。
身份验证请求的示例是:
https://login.microsoftonline.com/b2ctechready.onmicrosoft.com/oauth2/v2.0/authorize?p=b2c_1a_invitation&...&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=eyJhbGci...7m9s&state=CfDJ8EPk...Et0w
我很好奇在通过 Azure 请求 OAuth2 令牌时是否可以读取查询参数?
本质上,当使用我创建的策略进行测试调用时,我希望从调用中读取额外的查询参数,并且编排(用户旅程)步骤应该读取这些值并将该值注入到自定义声明(用于 JWT 或 ID 令牌)。
我从下面的链接知道它可能*可以使用 Azure B2C 服务?但是我找不到任何好的具体例子。
Sign-up policy - Set user attributes through code
Add Custom Attribute Not Used in Sign-Up nor Edit Policy
然后我继续尝试了一堆配置,但是可供选择的选项太多了,我不知道该选择哪个。此外,我还没有找到任何描述配置这些策略时使用的选项的 Azure 文档。无论如何,这就是我所拥有的。
我从 here. I got this Github link from this Azure doc 下载了 TrustFrameworkBase.xml 和 TrustFrameworkExtensions.xml,我还按照设置策略密钥的步骤进行操作,并添加了具有委派权限的应用程序注册。对于我的信赖方配置,我只是通过 Azure B2C 门户制定了一个自定义策略,并将其下载为起点,以探索它在基本形式中的样子。
这是我在 ClaimsSchema 标签内添加到基本策略的自定义声明。 extension_Test 是我想从查询参数中注入值的声明:
<ClaimType Id="extension_Test">
<DisplayName>Test value</DisplayName>
<DataType>string</DataType>
<DefaultPartnerClaimTypes>
<Protocol Name="OAuth2" PartnerClaimType="extension_Test" />
<Protocol Name="OpenIdConnect" PartnerClaimType="extension_Test" />
</DefaultPartnerClaimTypes>
<UserInputType>Readonly</UserInputType>
</ClaimType>
</ClaimsSchema>
在相同的基本策略中,这是我为登录添加的用户旅程:
<UserJourney Id="SignIn">
<OrchestrationSteps>
<OrchestrationSteps>
<!-- The following orchestration step is always executed. -->
<OrchestrationStep Order="1" Type="ClaimsProviderSelection" ContentDefinitionReferenceId="api.idpselection.signupsignin">
<ClaimsProviderSelections>
<ClaimsProviderSelection TargetClaimsExchangeId="LocalAccountRegistrationExchange" />
</ClaimsProviderSelections>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="LocalAccountRegistrationExchange" TechnicalProfileReferenceId="LocalAccount-Registration-VerifiedEmail" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
</OrchestrationSteps>
</UserJourney>
这是我的依赖配置XML:
<RelyingParty>
<DefaultUserJourney ReferenceId="SignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_Test" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="displayName" />
<OutputClaim ClaimTypeReferenceId="givenName" />
<OutputClaim ClaimTypeReferenceId="surname" />
<OutputClaim ClaimTypeReferenceId="extension_Test" />
<OutputClaim ClaimTypeReferenceId="objectId" PartnerClaimType="sub" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
我认为按顺序上传了基础、扩展和 RP 策略 XML 文件。我发送的 GET 请求如下所示(来自自定义策略的 "Run now" 按钮):
https://login.microsoftonline.com/<TENANT>/oauth2/v2.0/authorize?p=B2C_1A_test&client_id=<TENANTID>&nonce=defaultNonce&redirect_uri=http%3A%2F%2Flocalhost%2Fredirect&scope=openid&response_type=id_token&prompt=login&extension_Test=aaa
任何帮助将不胜感激,谢谢!或者 Azure 文档解释了这些配置文件中的更多选项——例如 CpimIssuerTechnicalProfileReferenceId="JwtIssuer" 是什么意思?或者 AzureFunction-WrapWebHook 是什么意思?
你很接近。
输入旅程声明,然后在此旅程中使用它(例如先决条件或存储)以及从旅程中输出它的端到端示例,可以在 this "Implementing an invitation flow" document(我是作者)。
高级解决方案是:
1) 在设计时,使用输入声明配置依赖方策略。
<RelyingParty>
<DefaultUserJourney ReferenceId="SignIn" />
<TechnicalProfile Id="PolicyProfile">
<DisplayName>PolicyProfile</DisplayName>
<Protocol Name="OpenIdConnect" />
<InputTokenFormat>JWT</InputTokenFormat>
<CryptographicKeys>
<Key Id="client_secret" StorageReferenceId="B2C_1A_MySharedSecret" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="extension_Test" />
</InputClaims>
<OutputClaims>
...
<OutputClaim ClaimTypeReferenceId="extension_Test" />
</OutputClaims>
<SubjectNamingInfo ClaimType="sub" />
</TechnicalProfile>
</RelyingParty>
您必须创建一个策略密钥(在上面的示例中,它被称为 "MySharedSecret",但它可以被称为任何东西)包含调用此策略的应用程序已知的共享秘密(其中此应用程序的客户端机密可以是此共享机密)。
2) 在运行时,创建一个包含输入声明的自发布 JWT,使用共享密钥对该 JWT 进行签名,然后使用 "client_assertion_type" 和 [=34= 将 JWT 添加到身份验证请求中]参数。
可在 the Wingtip sample 中找到此代码示例。
身份验证请求的示例是:
https://login.microsoftonline.com/b2ctechready.onmicrosoft.com/oauth2/v2.0/authorize?p=b2c_1a_invitation&...&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer&client_assertion=eyJhbGci...7m9s&state=CfDJ8EPk...Et0w