使用JWT令牌或代码作为策略密钥的Azure B2C调用Azure函数

问题描述

是否可以在服务URL中不对功能代码进行硬编码的情况下调用azure函数? 例如,使用策略密钥并将其作为查询字符串/标题发送。我不想暴露它。 另一种方法是在应用程序服务级别上使用AAD身份验证,但这将需要在步骤“ SendClaims”之前生成JWT令牌,并且这可能导致经过身份验证的用户可以使用此功能。 感谢您的帮助。

编辑: 好的,我按照建议进行了工作,到现在为止,我已经完成了所有设置。 我可以使用邮递员索取可使用的令牌,并适当地授权使用azure功能。 我已通过将其作为用户声明输出(已确认获取步骤正在工作),在用户使用过程中调试了该令牌(但我在调用函数时遇到了错误

AADB2C90027:为“ Azure功能通知新用户注册”指定的基本凭据无效。检查凭据是否正确以及资源是否已授予访问权限。

到目前为止,我的xml文件如下所示:

<ClaimsProvider>
  <displayName>Aquire JWT token to call azure function</displayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="Azure-Functions-Notify-New-User-Registered-Accesstoken">
      <displayName>Acquire JWT token to call azure function</displayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider,Web.TPEngine,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">https://login.microsoftonline.com/{my-tenant}/oauth2/v2.0/token</Item>
        <Item Key="AuthenticationType">Basic</Item>
        <Item Key="SendClaimsIn">Form</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_NotifyNewUserRegisteredClientId" />
        <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_NotifyNewUserRegisteredSecret" />
      </CryptographicKeys>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="client_credentials" AlwaysUseDefaultValue="true" />
        <InputClaim ClaimTypeReferenceId="scope" DefaultValue="https://{my-tenant}/{my-resoruce-id}/.default" AlwaysUseDefaultValue="true" />
      </InputClaims>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="bearerToken" PartnerClaimType="access_token" />
      </OutputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

<ClaimsProvider>
  <displayName>Azure-Functions-Notify-New-User-Registered</displayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="Azure-Functions-Notify-New-User-Registered">
      <displayName>Call Azure Function when new user registers</displayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider,PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">{my-azure-function-with-function-code}</Item>
        <Item Key="SendClaimsIn">Body</Item>
        <Item Key="AuthenticationType">Bearer</Item>
        <Item Key="UseClaimAsBearerToken">bearerToken</Item>
        <Item Key="AllowInsecureAuthInProduction">false</Item>
      </Metadata>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="bearerToken"/>
      </InputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

我的用户历程:

    <orchestrationStep Order="7" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="Azure-Functions-Notify-New-User-Registered-Accesstoken" TechnicalProfileReferenceId="Azure-Functions-Notify-New-User-Registered-Accesstoken" />
      </ClaimsExchanges>
    </orchestrationStep>

    <orchestrationStep Order="8" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="Azure-Functions-Notify-New-User-Registered" TechnicalProfileReferenceId="Azure-Functions-Notify-New-User-Registered" />
      </ClaimsExchanges>
    </orchestrationStep>

    <orchestrationStep Order="9" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />

解决方法

使用AAD保护它。使用以下方法将JWT转到功能应用程序: https://docs.microsoft.com/en-us/azure/active-directory-b2c/secure-rest-api#oauth2-bearer-authentication

没有,您不必担心用户会收到此JWT,除非您决定在依赖方部分中将此JWT作为声明输出,否则是不可能的。