azure - 为什么自定义 Azure B2C 策略 SignUpInvitation.xml 会引发 `Object reference not set to an instance of an object` 错误?

标签 azure azure-ad-b2c

我正在尝试从以下 URL 的存储库中获取示例项目,使其正常工作。

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

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

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

产生错误

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

AADB2C: An exception has occurred

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

  {
    ""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 提到它正在获取输入声明。因此,在我看来,在获取 claim 方面,政策或我的配置可能存在问题。因此,我在 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 ,来自应用程序洞察。这是从我的 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>

最佳答案

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

关于azure - 为什么自定义 Azure B2C 策略 SignUpInvitation.xml 会引发 `Object reference not set to an instance of an object` 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60835115/

相关文章:

azure-ad-b2c - B2C/IEF 使用用户名重置密码

node.js - Service Worker 在 React 应用程序中刷新后导致空白页面

azure - Azure Redis 缓存下的通知

azure - 使用 Azure 函数和 API 连接器 Azure B2C 生成显示名称

azure-ad-b2c - 身份验证与授权?

azure - 更改 Azure B2C 电子邮件地址时,是否也需要更改 UPN

azure - 托管(命令行)Windows 应用程序的最佳解决方案?

azure - 如何从 Azure Functions 通过 SSH 连接到 Azure VM?

azure - 如何通过 VSTS 将 Azure WebJob 和应用程序部署到同一应用程序服务?

Azure AD B2C - 从所有 session 中注销用户