如何通过Azure AD B2C将第三方IDP的刷新令牌传递给应用程序?

时间:2020-08-25 06:35:11

标签: azure-ad-b2c

我正在开发一个可以读取给定OneDrive帐户文件的应用程序。

我们使用Azure AD B2C作为身份提供者。用户可以使用其Microsoft帐户登录到该应用程序。为此,我们的AAD B2C租户中有enabled Microsoft as an Identity Provider

当给定用户使用其Microsoft帐户登录时,应用程序应该能够同时获取access_tokenrefresh_token,这使我们能够与MS Graph API进行通信,以便获取文件详细信息。 / p>

使用自定义策略,我们可以提取access_token。但是,我们无法获取refresh_token

这是ClaimsSchema在TrustFrameworkExtensions.xml中的定义方式:

<ClaimsSchema>
      <ClaimType Id="ms_access_token">
        <DisplayName>MS access token</DisplayName>
        <DataType>string</DataType>
        <DefaultPartnerClaimTypes>
          <Protocol Name="OAuth2" PartnerClaimType="{oauth2:access_token}" />
          <Protocol Name="OpenIdConnect" PartnerClaimType="{oauth2:access_token}" />
        </DefaultPartnerClaimTypes>
        <UserHelpText>access token form 3rd party MS AD.</UserHelpText>
      </ClaimType>
      <ClaimType Id="ms_refresh_token">
        <DisplayName>MS Refresh token</DisplayName>
        <DataType>string</DataType>
        <DefaultPartnerClaimTypes>
          <Protocol Name="OAuth2" PartnerClaimType="{oauth2:refresh_token}" />
          <Protocol Name="OpenIdConnect" PartnerClaimType="{oauth2:refresh_token}" />
        </DefaultPartnerClaimTypes>
        <UserHelpText>refresh token form 3rd party MS AD.</UserHelpText>
      </ClaimType>
</ClaimsSchema>

还在同一文件中的Microsoft登录名TechnicalProfile下,添加了OutputClaims节点(为清楚起见,删除了一些子节点):

<OutputClaims>
    <OutputClaim ClaimTypeReferenceId="ms_access_token" DefaultValue=""  />
    <OutputClaim ClaimTypeReferenceId="ms_refresh_token" DefaultValue=""  />
</OutputClaims>

然后在RelyingParty节点之后的相关OutputClaims节点下添加(为清楚起见,删除了一些子节点):

<OutputClaims>
    <OutputClaim ClaimTypeReferenceId="ms_access_token" PartnerClaimType="ms_idp_access_token"/>
    <OutputClaim ClaimTypeReferenceId="ms_refresh_token" PartnerClaimType="ms_idp_refresh_token"/>
</OutputClaims>

根据documentation,没有refresh_token的索赔解决程序。

有人建议进行这项工作吗?

3 个答案:

答案 0 :(得分:0)

我认为您唯一的方法是通过自定义api,该api使用密码流对用户进行身份验证。然后,您可以从API返回return_token,access_token等。我还没有其他方法可以做到这一点。

答案 1 :(得分:0)

最后,我可以在MS forum的Microsoft员工的帮助下解决此问题。

到目前为止,Azure AD B2C尚不支持OIDC提供程序提供此功能。因此,我们必须启用Microsoft作为OAuth2身份提供程序,而不是OIDC。为此,我们必须定义如下的ClaimProvider:

  <ClaimsProviders>
    <ClaimsProvider>
      <Domain>live.com</Domain>
      <DisplayName>Microsoft Account</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="MSA-OAuth">
          <DisplayName>Microsoft Account</DisplayName>
          <Protocol Name="OAuth2"/>
          <OutputTokenFormat>JWT</OutputTokenFormat>
          <Metadata>
            <Item Key="AccessTokenEndpoint">https://login.live.com/oauth20_token.srf</Item>
            <Item Key="authorization_endpoint">https://login.live.com/oauth20_authorize.srf</Item>
            <Item Key="ClaimsEndpoint">https://graph.microsoft.com/v1.0/me</Item>
            <Item Key="ClaimsEndpointAccessTokenName">access_token</Item>
            <Item Key="BearerTokenTransmissionMethod">AuthorizationHeader</Item>
            <Item Key="client_id"><!-- your client id --></Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="scope">openid profile email offline_access files.read</Item>
            <Item Key="UsePolicyInRedirectUri">0</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_SampathAdCustomPolicyAppKey"/>
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="live.com" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
            <OutputClaim ClaimTypeReferenceId="issuerUserId" PartnerClaimType="id"/>
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
            <OutputClaim ClaimTypeReferenceId="email" />
            <OutputClaim ClaimTypeReferenceId="ms_access_token" PartnerClaimType="{oauth2:access_token}"/>
            <OutputClaim ClaimTypeReferenceId="ms_refresh_token" PartnerClaimType="{oauth2:refresh_token}"/>
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
            <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider> 

答案 2 :(得分:0)

请注意, {oauth2:refresh_token} 声明解析器返回JSON字符串,例如:

{
  "r": "<refresh_token>",
  "d": "live.com"
}

您可以按照以下方式从此JSON字符串中读取 r 属性。

  1. 创建a GetClaimFromJson claims transformation
<ClaimsTransformation Id="GetRefreshTokenFromRefreshTokenResult" TransformationMethod="GetClaimFromJson">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="ms_refresh_token" TransformationClaimType="inputJson" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="claimToExtract" DataType="string" Value="r" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="ms_refresh_token" TransformationClaimType="extractedClaim" />
  </OutputClaims>
</ClaimsTransformation>
  1. MSA-OAuth 技术资料中调用此索赔转换作为输出索赔转换:
<OutputClaimsTransformations>
  <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName"/>
  <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName"/>
  <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId"/>
  <OutputClaimsTransformation ReferenceId="CreateSubjectClaimFromAlternativeSecurityId"/>
  <OutputClaimsTransformation ReferenceId="GetRefreshTokenFromRefreshTokenResult" />
</OutputClaimsTransformations>