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