Как устранить неполадки, связанные с ответом конечной точки RESTful в настраиваемой политике Azure AD B2C

Я пытаюсь получить группы, к которым принадлежит определенный пользователь, во время их входа в систему.

Для этого я использую вызов API-интерфейса RESTful graph.

Вот мои технические профили. Идея состоит в том, чтобы получить токен для моего приложения Graph API и использовать этот токен для выполнения / getMemberGroups, чтобы получить группы как StringCollection:

<ClaimsProvider>
    <DisplayName>Get user groups of a certain user</DisplayName>
    <TechnicalProfiles>
      <TechnicalProfile Id="GetAccessTokenForGraphApi">
        <DisplayName></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/{tenant_name}.onmicrosoft.com/oauth2/v2.0/token</Item>
          <Item Key="AuthenticationType">Basic</Item>
          <Item Key="SendClaimsIn">Form</Item>
        </Metadata>
        <CryptographicKeys>
          <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_userMgntAppId" />
          <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_userMgntAppClientSecret" />
        </CryptographicKeys>
        <InputClaims>
          <InputClaim ClaimTypeReferenceId="grant_type" DefaultValue="client_credentials" />
          <InputClaim ClaimTypeReferenceId="scope" DefaultValue="https://graph.microsoft.com/.default" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="bearerToken" PartnerClaimType="access_token" />
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
      <TechnicalProfile Id="GetUserGroups">
        <DisplayName>Retrieves security groups assigned to the user</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://graph.microsoft.com/v1.0/users/{objectId}/getMemberGroups</Item>
          <Item Key="AuthenticationType">Bearer</Item>
          <Item Key="UseClaimAsBearerToken">bearerToken</Item>
          <Item Key="SendClaimsIn">Body</Item>
          <Item Key="AllowInsecureAuthInProduction">true</Item>
          <Item Key="ClaimUsedForRequestPayload">securityEnabledOnly</Item>
          <Item Key="DefaultUserMessageIfRequestFailed">Cannot process your request right now, please try again later.</Item>
        </Metadata>
        <InputClaims>
          <InputClaim Required="true" ClaimTypeReferenceId="objectId" />
          <InputClaim Required="true" ClaimTypeReferenceId="bearerToken" />
          <InputClaim Required="true" ClaimTypeReferenceId="securityEnabledOnly" DefaultValue="false" AlwaysUseDefaultValue="true" />
        </InputClaims>
        <OutputClaims>
          <OutputClaim ClaimTypeReferenceId="groups" PartnerClaimType="value" />
        </OutputClaims>
        <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
      </TechnicalProfile>
    </TechnicalProfiles>
  </ClaimsProvider>

GetAccessTokenForGraphApi TP работает нормально, и я могу получить bearerToken вывод, если вызову его исключительно в моем userJourney.

Однако, когда я добавляю GetUserGroups TP в качестве следующего шага оркестровки, в моем журнале аналитики приложений возникает исключение такого рода:

{
    "Kind": "HandlerResult",
    "Content": {
      "Result": true,
      "RecorderRecord": {
        "Values": [
          {
            "Key": "SendErrorTechnicalProfile",
            "Value": "OpenIdConnectProtocolProvider"
          },
          {
            "Key": "Exception",
            "Value": {
              "Kind": "Handled",
              "HResult": "80131500",
              "Message": "Cannot process your request right now, please try again later.",
              "Data": {
                "IsPolicySpecificError": false
              },
              "Exception": {
                "Kind": "Handled",
                "HResult": "80131500",
                "Message": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.",
                "Data": {}
              }
            }
          }
        ]
      },

Я считаю, что при вызове конечной точки RESTful произошла ошибка. Мой вопрос в том, как я могу визуализировать успокаивающий зов, чтобы увидеть, что я на самом деле отправляю? Например, как вы можете видеть, я помещаю objectId в свой URL-адрес, поэтому просмотр фактического URL-адреса может быть полезен для устранения неполадок с успокаивающим вызовом.

Пожалуйста, дайте мне знать, если мне понадобится дополнительная информация. Спасибо заранее!


person ray    schedule 13.01.2021    source источник
comment
stackoverflow.com/questions/54875609/ Динамические URL-адреса могут поддерживаться в Restful Provider с ключом метаданных SendClaimsAs = Url   -  person Saravana Kumar    schedule 13.01.2021
comment
Привет @Ray. Я не верю, что записи Application Insights содержат URL-адрес запроса. Что если вы временно измените имя хоста запроса с graph.microsoft.com на туннель ngrok для проверки URL-адреса запроса. Кстати, я не верю, что вы можете включить значение утверждения (например, objectId) для операции POST в URL-адрес запроса, но, тем не менее, вы можете попробовать добавить {Claim:objectId} в URL-адрес запроса и добавить IncludeClaimResolvingInClaimsHandling метаданные.   -  person Chris Padgett    schedule 13.01.2021
comment
Привет, @SaravanaKumar, сначала спасибо за вашу помощь :) Я знаю о параметре SendClaimsAs, но затем я потерял возможность отправлять тело securityEnabledOnly JSON, то есть требуется для вызова API графа.   -  person ray    schedule 13.01.2021
comment
Привет @ChrisPadgett, спасибо за вашу помощь :) Я сомневаюсь, что я даже отправляю не по правильному URL .. Ваше предложение туннеля ngrok выглядит многообещающим, и я попробую это сделать. Судя по результатам моего исследования в Google, похоже, что все рабочие примеры объединяют этот вызов API графа с другим API, чтобы помочь запустить вызов RESTful и обойти ограничение синтаксиса в настраиваемой политике ADB2C.   -  person ray    schedule 13.01.2021


Ответы (1)


Вы не можете этого сделать: <Item Key="ServiceUrl">https://graph.microsoft.com/v1.0/users/{objectId}/getMemberGroups</Item>

И это в сочетании: <Item Key="SendClaimsIn">Body</Item>

Вы можете отправлять утверждения в URL-адресе, где ваш распознаватель утверждений будет разрешать objectId, или вы можете отправлять утверждения в теле. https://docs.microsoft.com/en-us/azure/active-directory-b2c/restful-technical-profile#metadata

Вот почему ваш звонок терпит неудачу.

Вам нужно вызвать свой собственный API, а затем создать собственный API-интерфейс Graph API.

person Jas Suri - MSFT    schedule 14.01.2021