Udostępnij za pośrednictwem


Rozwiązywanie problemów z interfejsem API dostawcy oświadczeń niestandardowych

Zdarzenia uwierzytelniania i niestandardowe dostawcy oświadczeń umożliwiają dostosowanie środowiska uwierzytelniania entra firmy Microsoft przez integrację z systemami zewnętrznymi. Można na przykład utworzyć niestandardowy interfejs API dostawcy oświadczeń i skonfigurować aplikację OpenID Connect lub aplikację SAML do odbierania tokenów z oświadczeniami z magazynu zewnętrznego.

Zachowanie błędu

Gdy wywołanie interfejsu API zakończy się niepowodzeniem, zachowanie błędu jest następujące:

  • W przypadku aplikacji OpenId Connect — identyfikator Entra firmy Microsoft przekierowuje użytkownika z powrotem do aplikacji klienckiej z powodu błędu. Token nie jest wybity.
  • W przypadku aplikacji SAML — identyfikator Entra firmy Microsoft pokazuje użytkownikowi ekran błędu w środowisku uwierzytelniania. Użytkownik nie jest przekierowywany z powrotem do aplikacji klienckiej.

Kod błędu wysłany z powrotem do aplikacji lub użytkownik jest ogólny. Aby rozwiązać problemy, sprawdź dzienniki logowania pod kątem kodów błędów.

Rejestrowanie

Aby rozwiązać problemy z punktem końcowym interfejsu API REST dostawcy oświadczeń niestandardowych, interfejs API REST musi obsługiwać rejestrowanie. Usługa Azure Functions i inne platformy deweloperskie interfejsu API zapewniają szczegółowe rozwiązania do rejestrowania. Skorzystaj z tych rozwiązań, aby uzyskać szczegółowe informacje na temat zachowania interfejsów API i rozwiązywania problemów z logiką interfejsu API.

Dzienniki logowania w usłudze Microsoft Entra

Napiwek

Kroki opisane w tym artykule mogą się nieznacznie różnić w zależności od portalu, od którego zaczynasz.

Oprócz dzienników interfejsu API REST i hostowania rozwiązań diagnostycznych środowiska można również użyć dzienników logowania firmy Microsoft Entra. Korzystając z dzienników logowania firmy Microsoft Entra, można znaleźć błędy, które mogą mieć wpływ na logowania użytkowników. Dzienniki logowania w usłudze Microsoft Entra zawierają informacje o stanie HTTP, kodzie błędu, czasie trwania wykonywania i liczbie ponownych prób, które wystąpiły, interfejs API został wywołany przez identyfikator Firmy Microsoft Entra.

Dzienniki logowania w usłudze Microsoft Entra również integrują się z usługą Azure Monitor. Możesz skonfigurować alerty i monitorowanie, wizualizować dane i integrować je z narzędziami do zarządzania informacjami i zdarzeniami zabezpieczeń (SIEM). Możesz na przykład skonfigurować powiadomienia, jeśli liczba błędów przekroczy wybrany próg.

Aby uzyskać dostęp do dzienników logowania firmy Microsoft Entra:

  1. Zaloguj się do centrum administracyjnego firmy Microsoft Entra co najmniej jako administrator aplikacji w chmurze.

  2. Przejdź do aplikacji dla przedsiębiorstw usługi Identity>Applications>.

  3. Wybierz pozycję Dzienniki logowania, a następnie wybierz najnowszy dziennik logowania.

  4. Aby uzyskać więcej informacji, wybierz kartę Zdarzenia uwierzytelniania. Zostaną wyświetlone informacje związane z wywołaniem interfejsu API REST rozszerzenia niestandardowego uwierzytelniania, w tym wszelkie kody błędów.

    Zrzut ekranu przedstawiający informacje o zdarzeniach uwierzytelniania.

Odwołanie do kodów błędów

Skorzystaj z poniższej tabeli, aby zdiagnozować kod błędu.

Kod błędu Błąd nazwy opis
1003000 EventHandlerUnexpectedError Wystąpił nieoczekiwany błąd podczas przetwarzania programu obsługi zdarzeń.
1003001 CustomExtenstionUnexpectedError Wystąpił nieoczekiwany błąd podczas wywoływania niestandardowego interfejsu API rozszerzenia.
1003002 CustomExtensionInvalidHTTPStatus Interfejs API rozszerzenia niestandardowego zwrócił nieprawidłowy kod stanu HTTP. Sprawdź, czy interfejs API zwraca akceptowany kod stanu zdefiniowany dla tego niestandardowego typu rozszerzenia.
1003003 CustomExtensionInvalidResponseBody Wystąpił problem podczas analizowania treści odpowiedzi rozszerzenia niestandardowego. Sprawdź, czy treść odpowiedzi interfejsu API znajduje się w akceptowalnym schemacie dla tego niestandardowego typu rozszerzenia.
1003004 CustomExtensionThrottlingError Istnieje zbyt wiele niestandardowych żądań rozszerzenia. Ten wyjątek jest zgłaszany w przypadku niestandardowych wywołań interfejsu API rozszerzeń w przypadku osiągnięcia limitów ograniczania przepustowości.
1003005 CustomExtensionTimedOut Rozszerzenie niestandardowe nie odpowiedziało w ramach dozwolonego limitu czasu. Sprawdź, czy interfejs API odpowiada w ramach skonfigurowanego limitu czasu dla rozszerzenia niestandardowego. Może również wskazywać, że token dostępu jest nieprawidłowy. Wykonaj kroki, aby bezpośrednio wywołać interfejs API REST.
1003006 CustomExtensionInvalidResponseContentType Typ zawartości odpowiedzi rozszerzenia niestandardowego nie jest "application/json".
1003007 CustomExtensionNullClaimsResponse Interfejs API rozszerzenia niestandardowego odpowiedział przy użyciu torby oświadczeń o wartości null.
1003008 CustomExtensionInvalidResponseApiSchemaVersion Interfejs API rozszerzenia niestandardowego nie odpowiedział przy użyciu tego samego interfejsu APISchemaVersion, dla którego został wywołany.
1003009 CustomExtensionEmptyResponse Treść odpowiedzi interfejsu API rozszerzenia niestandardowego miała wartość null, gdy nie było to oczekiwane.
1003010 CustomExtensionInvalidNumberOfActions Odpowiedź interfejsu API rozszerzenia niestandardowego zawierała inną liczbę akcji niż te obsługiwane dla tego niestandardowego typu rozszerzenia.
1003011 CustomExtensionNotFound Nie można odnaleźć rozszerzenia niestandardowego skojarzonego z odbiornikiem zdarzeń.
1003012 CustomExtensionInvalidActionType Rozszerzenie niestandardowe zwróciło nieprawidłowy typ akcji zdefiniowany dla tego niestandardowego typu rozszerzenia.
1003014 CustomExtensionIncorrectResourceIdFormat Właściwość identifierUris w manifeście rejestracji aplikacji dla rozszerzenia niestandardowego powinna mieć format "api://{w pełni kwalifikowana nazwa domeny}/{appid}.
1003015 CustomExtensionDomainNameDoesNotMatch TargetUrl i resourceId rozszerzenia niestandardowego powinny mieć taką samą w pełni kwalifikowaną nazwę domeny.
1003016 CustomExtensionResourceServicePrincipalNotFound Identyfikator appId niestandardowego identyfikatora resourceId rozszerzenia powinien odpowiadać rzeczywistej jednostce usługi w dzierżawie.
1003017 CustomExtensionClientServicePrincipalNotFound Nie można odnaleźć jednostki usługi zasobów rozszerzenia niestandardowego w dzierżawie.
1003018 CustomExtensionClientServiceDisabled Jednostka usługi zasobów rozszerzenia niestandardowego jest wyłączona w tej dzierżawie.
1003019 CustomExtensionResourceServicePrincipalDisabled Jednostka usługi zasobów rozszerzenia niestandardowego jest wyłączona w tej dzierżawie.
1003020 CustomExtensionIncorrectTargetUrlFormat Docelowy adres URL jest w niewłaściwym formacie. Musi to być prawidłowy adres URL rozpoczynający się od https.
1003021 CustomExtensionPermissionNotGrantedToServicePrincipal Jednostka usługi nie ma zgody administratora dla roli aplikacji CustomAuthenticationExtensions.Receive.Payload (nazywanej również uprawnieniem aplikacji), która jest wymagana, aby aplikacja odbierała niestandardowe żądania HTTP rozszerzenia uwierzytelniania.
1003022 CustomExtensionMsGraphServicePrincipalDisabledOrNotFound Jednostka usługi MS Graph jest wyłączona lub nie można jej odnaleźć w tej dzierżawie.
1003023 CustomExtensionBlocked Punkt końcowy używany dla rozszerzenia niestandardowego jest blokowany przez usługę.
1003024 CustomExtensionResponseSizeExceeded Rozmiar odpowiedzi rozszerzenia niestandardowego przekroczył maksymalny limit.
1003025 CustomExtensionResponseClaimsSizeExceeded Całkowity rozmiar oświadczeń w odpowiedzi rozszerzenia niestandardowego przekroczył maksymalny limit.
1003026 CustomExtensionNullOrEmptyClaimKeyNotSupported Interfejs API rozszerzenia niestandardowego odpowiedział oświadczeniami zawierającymi wartość null lub pusty klucz"
1003027 CustomExtensionConnectionError Błąd podczas nawiązywania połączenia z niestandardowym interfejsem API rozszerzenia.

Bezpośrednie wywoływanie interfejsu API REST

Interfejs API REST jest chroniony przez token dostępu firmy Microsoft Entra. Interfejs API można przetestować według;

  • Uzyskiwanie tokenu dostępu przy użyciu rejestracji aplikacji skojarzonej z niestandardowymi rozszerzeniami uwierzytelniania
  • Testowanie interfejsu API lokalnie przy użyciu narzędzia do testowania interfejsu API.
  1. W celach programowania i testowania lokalnego otwórz local.settings.json i zastąp kod następującym kodem JSON:

    {
      "IsEncrypted": false,
      "Values": {
        "AzureWebJobsStorage": "",
        "AzureWebJobsSecretStorageType": "files",
        "FUNCTIONS_WORKER_RUNTIME": "dotnet",
        "AuthenticationEvents__BypassTokenValidation" : false
      }
    }
    

    Uwaga

    Jeśli użyto pakietu NuGet Microsoft.Azure.WebJobs.Extensions.AuthenticationEvents , pamiętaj, aby ustawić "AuthenticationEvents__BypassTokenValidation" : true go na potrzeby testowania lokalnego.

  2. Za pomocą preferowanego narzędzia do testowania interfejsu API utwórz nowe żądanie HTTP i ustaw metodę HTTP na POST.

  3. Użyj następującej treści JSON, która naśladuje żądanie wysyłane przez identyfikator Entra firmy Microsoft do interfejsu API REST.

    {
        "type": "microsoft.graph.authenticationEvent.tokenIssuanceStart",
        "source": "/tenants/aaaabbbb-0000-cccc-1111-dddd2222eeee/applications/00001111-aaaa-2222-bbbb-3333cccc4444",
        "data": {
            "@odata.type": "microsoft.graph.onTokenIssuanceStartCalloutData",
            "tenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee",
            "authenticationEventListenerId": "11112222-bbbb-3333-cccc-4444dddd5555",
            "customAuthenticationExtensionId": "22223333-cccc-4444-dddd-5555eeee6666",
            "authenticationContext": {
                "correlationId": "aaaa0000-bb11-2222-33cc-444444dddddd",
                "client": {
                    "ip": "127.0.0.1",
                    "locale": "en-us",
                    "market": "en-us"
                },
                "protocol": "OAUTH2.0",
                "clientServicePrincipal": {
                    "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
                    "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
                    "appDisplayName": "My Test application",
                    "displayName": "My Test application"
                },
                "resourceServicePrincipal": {
                    "id": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
                    "appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
                    "appDisplayName": "My Test application",
                    "displayName": "My Test application"
                },
                "user": {
                    "companyName": "Casey Jensen",
                    "createdDateTime": "2023-08-16T00:00:00Z",
                    "displayName": "Casey Jensen",
                    "givenName": "Casey",
                    "id": "00aa00aa-bb11-cc22-dd33-44ee44ee44ee",
                    "mail": "casey@contoso.com",
                    "onPremisesSamAccountName": "Casey Jensen",
                    "onPremisesSecurityIdentifier": "<Enter Security Identifier>",
                    "onPremisesUserPrincipalName": "Casey Jensen",
                    "preferredLanguage": "en-us",
                    "surname": "Jensen",
                    "userPrincipalName": "casey@contoso.com",
                    "userType": "Member"
                }
            }
        }
    }
    

    Napiwek

    Jeśli używasz tokenu dostępu uzyskanego z identyfikatora Entra firmy Microsoft, wybierz pozycję Autoryzacja , a następnie wybierz pozycję Token elementu nośnego, a następnie wklej token dostępu otrzymany z identyfikatora Entra firmy Microsoft.

  4. Wybierz pozycję Wyślij i powinna zostać odebrana odpowiedź JSON podobna do następującej:

    {
        "data": {
            "@odata.type": "microsoft.graph.onTokenIssuanceStartResponseData",
            "actions": [
                {
                    "@odata.type": "microsoft.graph.tokenIssuanceStart.provideClaimsForToken",
                    "claims": {
                        "customClaim1": "customClaimValue1",
                        "customClaim2": [
                            "customClaimString1",
                            "customClaimString2" 
                        ]
                    }
                }
    
            ]
        }
    }
    

Typowe ulepszenia wydajności

Jednym z najczęstszych problemów jest to, że interfejs API dostawcy oświadczeń niestandardowych nie odpowiada w ciągu dwóch sekund limitu czasu. Jeśli interfejs API REST nie odpowie w kolejnych ponownych próbach, uwierzytelnianie zakończy się niepowodzeniem. Aby zwiększyć wydajność interfejsu API REST, postępuj zgodnie z poniższymi sugestiami:

  1. Jeśli interfejs API uzyskuje dostęp do jakichkolwiek podrzędnych interfejsów API, buforuj token dostępu używany do wywoływania tych interfejsów API, więc nowy token nie musi być uzyskiwany w każdym wykonaniu.
  2. Problemy z wydajnością są często związane z usługami podrzędnymi. Dodaj rejestrowanie, które rejestruje czas procesu w celu wywołania dowolnych usług podrzędnych.
  3. Jeśli używasz dostawcy usług w chmurze do hostowania interfejsu API, użyj planu hostingu, który utrzymuje interfejs API zawsze "ciepły". W przypadku usługi Azure Functions może to być plan Premium lub plan dedykowany.
  4. Uruchom testy automatycznej integracji na potrzeby uwierzytelniania. Możesz również użyć narzędzi do testowania interfejsu API, aby przetestować tylko wydajność interfejsu API.

Zobacz też