首页 文章

Azure B2C - 将查询参数接受到OAuth2 JWT中

提问于
浏览
0

我很好奇在通过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

How can I return the PolicyId Claim after executing my Custom SignUpSignIn policy?

How do i include email in the redirect to AZURE AD B2C

然后我继续尝试了一堆配置,但有很多选项可供选择,我不知道选择哪一个 . 此外,我还没有找到任何描述配置这些策略时使用的选项的Azure文档 . 无论如何,这就是我所拥有的 .

我从here下载了TrustFrameworkBase.xml和TrustFrameworkExtensions.xml . 我从这个Azure doc获得了这个Github链接,我还按照设置策略密钥的步骤添加了一个带有委派权限的应用程序注册 . 对于我的依赖方配置,我只是通过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>

在相同的基本策略中,这是我为SignIn添加的用户之旅:

<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请求看起来像这样(来自自定义策略的“立即运行”按钮):

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是什么意思?

1 回答

  • 2

    你很亲密

    输入索赔到旅程,然后在此旅程中使用它(例如前置条件或存储)以及从旅程中输出它的端到端示例可以在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”和“client_assertion”参数将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

相关问题