【问题标题】:Why does custom Azure B2C policy, SignUpInvitation.xml, throw `Object reference not set to an instance of an object` error?为什么自定义 Azure B2C 策略 SignUpInvitation.xml 会引发“未将对象引用设置为对象实例”错误?
【发布时间】:2020-07-05 04:31:34
【问题描述】:

我正在尝试从以下 URL 上的这个 repo 获取示例项目。

https://github.com/azure-ad-b2c/samples/tree/master/policies/invite

示例项目包括一个自定义 B2C 策略 SignUpInvitation.xml 和一个 Web 项目。我的基本理解是,包含的自定义策略本质上需要一个签名令牌才能访问该策略。该示例基本上将此用作“邀请”步骤来限制对注册策略的访问。这就是我所追求的,所以我相信这个样本为我指明了正确的方向。我现在只是想让它工作。

我的问题是,在配置了我认为是所有必需的设置后,我从 B2C 策略中收到了一个错误 - 我认为。因此,我将首先介绍如何产生错误的步骤。

产生错误

我运行提供的网络项目并输入我的电子邮件,然后单击邀请。我收到了邀请电子邮件,其中包含指向自定义 B2C 策略的链接 - SignUpInvitation.xml。我单击该链接并转到该政策,但得到的页面显示发生了异常:

AADB2C:发生异常

找不到任何其他调试信息,我们将 Application Insights 配置添加到自定义策略,以便将输出记录到 App Insights。现在,在 AI 中,我可以看到该策略正在产生以下错误...

  {
    ""Kind"": ""Action"",
    ""Content"": ""Web.TPEngine.StateMachineHandlers.GetRelyingPartyInputClaimsHandler""
  },
  {
    ""Kind"": ""FatalException"",
    ""Content"": {
      ""Time"": ""7:05 PM"",
      ""Exception"": {
        ""Kind"": ""Handled"",
        ""HResult"": ""80004003"",
        ""Message"": ""Object reference not set to an instance of an object."",
        ""Data"": {}
      }
    }
  }

所以,有一个明显的错误,但消息仍然有点模糊。这就是我卡住的地方。我不确定如何进一步调试并查明导致引用错误的原因。

我调查的事情

通过调试过程,我基本上查看了我能找到的关于此的所有信息。我只是不太精通 B2C 策略 XML 脚本,这似乎是一个非常深入和技术性的话题。这是我有兴趣学习的主题,但需要一些关于如何调试脚本等的帮助。

我注意到的一件事是上述错误中的Action 提到它正在获取输入声明。因此,在我看来,在获取索赔时,政策或我的配置可能存在问题。因此,我在 App Insights 中查找上述消息的“堆栈跟踪”,并找到了以下操作和结果......

  {
    ""Kind"": ""Predicate"",
    ""Content"": ""Web.TPEngine.StateMachineHandlers.InitiatingMessageValidationHandler""
  },
  {
    ""Kind"": ""HandlerResult"",
    ""Content"": {
      ""Result"": false,
      ""RecorderRecord"": {
        ""Values"": [
          {
            ""Key"": ""Validation"",
            ""Value"": {
              ""Values"": [
                {
                  ""Key"": ""SubmittedBy"",
                  ""Value"": ""Application""
                },
                {
                  ""Key"": ""ProtocolProviderType"",
                  ""Value"": ""OpenIdConnectProtocolProvider""
                }
              ]
            }
          }
        ]
      },
      ""Statebag"": {
        ""MSG(e4c7c6a9-8023-4cf7-9a34-c920e8325284)"": {
          ""c"": ""2020-03-20T19:05:48.1325292Z"",
          ""k"": ""MSG(e4c7c6a9-8023-4cf7-9a34-c920e8325284)"",
          ""v"": ""{\""TenantId\"":\""wibradixdev.onmicrosoft.com\"",\""PolicyId\"":\""B2C_1A_signup_invitation\"",\""RedirectUri\"":\""https://jwt.ms/\"",\""AdditionalParameters\"":{\""TEST\"":\""TEST\"",\""p\"":\""B2C_1A_signup_invitation\""},\""Nonce\"":\""0eefd73e94224dc69d8766dd219180e6\"",\""ClientId\"":\""30639331-3c2c-4ade-8c36-814dfe007170\"",\""ResponseType\"":\""id_token\"",\""ResponseRedirector\"":{\""URI\"":\""https://jwt.ms\"",\""D\"":false,\""WF\"":true},\""Scope\"":\""openid\"",\""AppModelVersion\"":1,\""ScopedProviders\"":[]}"",
          ""p"": true,
          ""t"": ""OAuth2""
        },
        ""CMESSAGE"": {
          ""c"": ""2020-03-20T19:05:48.1325292Z"",
          ""k"": ""CMESSAGE"",
          ""v"": ""e4c7c6a9-8023-4cf7-9a34-c920e8325284"",
          ""p"": true
        },
        ""IMESSAGE"": {
          ""c"": ""2020-03-20T19:05:48.1325292Z"",
          ""k"": ""IMESSAGE"",
          ""v"": ""e4c7c6a9-8023-4cf7-9a34-c920e8325284"",
          ""p"": true
        },
        ""ComplexItems"": ""_MachineEventQ, TCTX, ORCH_IDX, REPRM, IC""
      },
      ""PredicateResult"": ""True""
    }
  }

这个动作似乎是在做某种类型的验证,但我注意到结果返回false,这通常意味着某种失败?在这种情况下我不确定。

我该如何进行?

为什么这个策略会抛出异常?

我将示例 Web 项目部署到 Azure,如果您想查看我看到的内容,可以访问 here

另外,here is a link to the full error text,来自 App Insights。这链接到我的 Github 问题,用于相同的相关问题。

编辑

这是要求的技术简介部分...

    <ClaimsProvider>
      <DisplayName>My ID Token Hint ClaimsProvider</DisplayName>
      <TechnicalProfiles>
        <TechnicalProfile Id="IdTokenHint_ExtractClaims">
          <DisplayName> My ID Token Hint TechnicalProfile</DisplayName>
          <Protocol Name="None" />
          <Metadata>

            <!--Sample action required: replace with your endpoint location -->
            <Item Key="METADATA">https://wibradixdev.b2clogin.com/wibradixdev.onmicrosoft.com/v2.0/.well-known/openid-configuration?p=B2C_1A_signup_invitation</Item>



            <!-- <Item Key="IdTokenAudience">your_optional_audience_override</Item> -->
            <!-- <Item Key="issuer">your_optional_token_issuer_override</Item> -->
          </Metadata>
          <OutputClaims>
            <!--Sample: Read the email cliam from the id_token_hint-->
            <OutputClaim ClaimTypeReferenceId="email" />  
          </OutputClaims>
        </TechnicalProfile>
      </TechnicalProfiles>
    </ClaimsProvider>
  </ClaimsProviders>

【问题讨论】:

  • OIDC 技术配置文件中配置的元数据端点中的 JWKS 端点有问题。元数据 url 是什么?
  • Jas,这让我有点过头了,如果我误解了你的要求,请原谅我。我认为您要的是策略发现端点?不过,我不确定这是否是您所说的技术资料。 Here is the discovery endpoint 作为我帖子中提到的示例的一部分的自定义政策。
  • 听起来您没有像从我们的日志中看到的那样涉及联合 IdP。你能分享一个指向你的政策文件的链接吗(它们不需要被审查)?
  • @JasSuri 我编辑了我的原始帖子以包含您所说的技术简介部分。我尝试将其设置为 ASP 项目的知名链接和 B2C 策略的知名链接 - 都产生了相同的错误。

标签: azure azure-ad-b2c


【解决方案1】:

我的问题的解决方案是技术配置文件的 METADATA 字段在提供的示例的自定义 B2C 政策中设置不正确。我将它设置为我们 B2C 策略的知名 URL,但它需要设置为我们的 id 提示服务的知名 URL,该服务位于示例代码的提供的 ASP 项目中。将其设置为正确的 URL 后,注册工作流程将按预期工作。

【讨论】:

    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 2011-07-09
    • 2012-08-31
    • 2011-11-21
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多