【问题标题】:Azure AD B2C - Custom Provider for GitHub cannot get access tokenAzure AD B2C - GitHub 的自定义提供程序无法获取访问令牌
【发布时间】:2018-05-23 18:42:13
【问题描述】:

我正在使用自定义策略将 GitHub 设置为 Azure AD B2C 中的自定义提供程序。我能够进入登录页面并成功重定向回正确的 azure 广告链接,但 Azure AD B2C 中的服务器错误始终拒绝 OAUTH 的第二部分。

当我查看应用洞察跟踪日志时,它显示“收到无效的 OAuth 响应”和“解析值时遇到意外字符:a”。这是我设置的策略提供程序:

<ClaimsProvider>
      <Domain>github.com</Domain>
      <DisplayName>GitHub</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="GitHub-OAUTH">
          <DisplayName>GitHub</DisplayName>
          <Protocol Name="OAuth2" />
          <Metadata>
            <Item Key="ProviderName">github</Item>
            <Item Key="authorization_endpoint">https://github.com/login/oauth/authorize</Item>
            <Item Key="AccessTokenEndpoint">https://github.com/login/oauth/access_token?</Item>
            <Item Key="HttpBinding">POST</Item>
            <Item Key="ClaimsEndpoint">https://api.github.com/user</Item>
            <Item Key="client_id">My Client Id</Item>
            <Item Key="UsePolicyInRedirectUri">0</Item>
            <Item Key="scope">user</Item>
            <Item Key="response_types">code</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="client_secret" StorageReferenceId="B2C_1A_GitHubSecret" />
          </CryptographicKeys>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="socialIdpUserId" PartnerClaimType="id" />
            <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
            <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
            <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="github.com" />
            <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
          </OutputClaims>
          <OutputClaimsTransformations>
            <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
            <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
            <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
          </OutputClaimsTransformations>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-SocialLogin" />
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>

我想知道问题是不是在 json 中没有返回 access_token?我自己在 postman 中逐步完成了所有步骤,代码作为 url 参数返回,access_token 在响应的正文中返回,如下所示:

access_token=<snip>&scope=user%3Aemail&token_type=bearer

我是否缺少自定义提供程序中的元数据项来支持此响应?或者这在 Azure AD B2C 中不起作用?

【问题讨论】:

    标签: azure oauth-2.0 azure-ad-b2c


    【解决方案1】:

    是的,这是因为访问令牌响应被编码为 HTML 表单,而不是 JSON。

    以下是如何与 GitHub 集成。

    1) 为long 类型的GitHub 用户标识符添加声明类型:

    <ClaimType Id="gitHubUserId">
      <DisplayName>GitHub User ID</DisplayName>
      <DataType>long</DataType>
    </ClaimType>
    

    2) 添加声明转换,用于从 long 类型的 GitHub 用户标识符转换为 string 类型的 Azure AD B2C 社交用户标识符:

    <ClaimsTransformation Id="CreateAlternativeSecurityUserIdForGitHub" TransformationMethod="ConvertNumberToStringClaim">
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="gitHubUserId" TransformationClaimType="inputClaim" />
      </InputClaims>
      <InputParameters>
        <InputParameter Id="stringFormat" DataType="string" Value="{0}" />
      </InputParameters>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="socialIdpUserId" TransformationClaimType="outputClaim" />
      </OutputClaims>
    </ClaimsTransformation>
    

    3) 添加 GitHub OAuth 流程的技术配置文件:

    <TechnicalProfile Id="GitHub-OAUTH">
      <DisplayName>GitHub</DisplayName>
      <Protocol Name="OAuth2" />
      <Metadata>
        <Item Key="ProviderName">github.com</Item>
        <Item Key="authorization_endpoint">https://github.com/login/oauth/authorize</Item>
        <Item Key="AccessTokenEndpoint">https://github.com/login/oauth/access_token</Item>
        <Item Key="HttpBinding">GET</Item>
        <Item Key="ClaimsEndpoint">https://api.github.com/user</Item>
        <Item Key="client_id">Insert the client identifier</Item>
        <Item Key="scope">user</Item>
        <Item Key="UserAgentForClaimsExchange">CPIM-Basic/{tenant}/{policy}</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="client_secret" StorageReferenceId="B2C_1A_GitHubSecret" />
      </CryptographicKeys>
      <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="gitHubUserId" PartnerClaimType="id" />
        <OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="email" />
        <OutputClaim ClaimTypeReferenceId="displayName" PartnerClaimType="name" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" DefaultValue="socialIdpAuthentication" />
        <OutputClaim ClaimTypeReferenceId="identityProvider" DefaultValue="github.com" />
      </OutputClaims>
      <OutputClaimsTransformations>
        <OutputClaimsTransformation ReferenceId="CreateRandomUPNUserName" />
        <OutputClaimsTransformation ReferenceId="CreateUserPrincipalName" />
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityUserIdForGitHub" />
        <OutputClaimsTransformation ReferenceId="CreateAlternativeSecurityId" />
      </OutputClaimsTransformations>
      <UseTechnicalProfileForSessionManagement ReferenceId="SSOSession-Noop" />
    </TechnicalProfile>
    

    【讨论】:

    • 克里斯,感谢您的回复!我能够在应用程序洞察力中看到声明响应是从 GitHub 返回的,但它仍然在 ValidateApiResponseHandler 阶段给出内部服务器错误(然后在返回错误之前转到 NoOpHandler):“自我断言发送响应失败,原因是“内部服务器错误”。”我将原始策略名称放在 UserAgentForClaimsExchange 字段中:CPIM-Basic//B2C_1A_signup_signin。这是要参考的正确政策吗?
    • UserAgentForClaimsExchange 是什么意思?
    • 您不应替换任何 {tenant} 或 {policy} 令牌。 Azure AD B2C 引擎将替换它们。
    • 啊,我明白了。感谢您的澄清!我遇到的服务器错误与验证期间无法处理“电子邮件”:“空”的电子邮件声明有关。我删除了电子邮件声明,您的解决方案运行良好。非常感谢!
    • 太棒了! @X.Ou GitHub 发出的email 声明,GitHub 用户必须有公开的email 地址,否则发出“null”。
    猜你喜欢
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2019-06-16
    • 2022-01-02
    相关资源
    最近更新 更多