Uzyskiwanie tokenów w celu wywoływania internetowego interfejsu API przy użyciu aplikacji demona

Po utworzeniu poufnej aplikacji klienckiej możesz uzyskać token dla aplikacji, wywołując AcquireTokenForClientmetodę , przekazując zakres i opcjonalnie wymuszając odświeżenie tokenu.

Zakresy do żądania

Zakres żądania przepływu poświadczeń klienta to nazwa zasobu, po którym następuje /.default. Ta notacja informuje identyfikator Entra firmy Microsoft o użyciu uprawnień na poziomie aplikacji zadeklarowanych statycznie podczas rejestracji aplikacji. Ponadto te uprawnienia interfejsu API muszą zostać przyznane przez administratora dzierżawy.

Oto przykład definiowania zakresów internetowego interfejsu API w ramach konfiguracji w pliku appsettings.json. Ten przykład jest pobierany z przykładu kodu demona konsoli platformy .NET w witrynie GitHub.

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Zasoby usługi Azure AD (wersja 1.0)

Zakres używany dla poświadczeń klienta powinien zawsze być identyfikatorem zasobu, po którym /.defaultnastępuje .

Ważne

Gdy biblioteka MSAL żąda tokenu dostępu dla zasobu, który akceptuje token dostępu w wersji 1.0, identyfikator Entra firmy Microsoft analizuje żądanych odbiorców z żądanego zakresu, przyjmując wszystko przed ostatnim ukośnikiem i używając go jako identyfikatora zasobu. Jeśli więc, podobnie jak usługa Azure SQL Database (https://database.windows.net), zasób oczekuje odbiorców kończących się ukośnikiem (w przypadku usługi Azure SQL Database, https://database.windows.net/), musisz zażądać zakresu https://database.windows.net//.default. (Zwróć uwagę na podwójny ukośnik). Zobacz również MSAL.NET problem nr 747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient API

Aby uzyskać token dla aplikacji, użyj AcquireTokenForClient lub jej odpowiednik, w zależności od platformy.

W przypadku aplikacji Microsoft.Identity.Web nie musisz uzyskiwać tokenu. Interfejsy API wyższego poziomu można używać, jak widać w temacie Wywoływanie internetowego interfejsu API z poziomu aplikacji demona. Jeśli jednak używasz zestawu SDK, który wymaga tokenu, poniższy fragment kodu pokazuje, jak uzyskać ten token.

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Identity.Abstractions;
using Microsoft.Identity.Web;

// In the Program.cs, acquire a token for your downstream API

var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protokół

Jeśli nie masz jeszcze biblioteki dla wybranego języka, możesz chcieć użyć protokołu bezpośrednio:

Pierwszy przypadek: uzyskiwanie dostępu do żądania tokenu przy użyciu udostępnionego wpisu tajnego

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

Drugi przypadek: Uzyskiwanie dostępu do żądania tokenu przy użyciu certyfikatu

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

Aby uzyskać więcej informacji, zobacz dokumentację protokołu: Platforma tożsamości Microsoft i przepływ poświadczeń klienta OAuth 2.0.

Rozwiązywanie problemów

Czy użyto zakresu resource/.default?

Jeśli zostanie wyświetlony komunikat o błędzie informujący o tym, że użyto nieprawidłowego zakresu, prawdopodobnie nie użyto resource/.default zakresu.

Jeśli podczas wywoływania interfejsu API otrzymasz niewystarczające uprawnienia do ukończenia operacji , administrator dzierżawy musi udzielić uprawnień aplikacji.

Jeśli nie udzielisz zgody administratora aplikacji, wystąpi następujący błąd:

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

Wybierz jedną z następujących opcji, w zależności od roli.

Administrator globalny dzierżawy

W przypadku administratora dzierżawy globalnej przejdź do obszaru Aplikacje dla przedsiębiorstw w centrum administracyjnym firmy Microsoft Entra. Wybierz rejestrację aplikacji i wybierz pozycję Uprawnienia w sekcji Zabezpieczenia w okienku po lewej stronie. Następnie wybierz duży przycisk z etykietą Udziel zgody administratora dla {Nazwa dzierżawy} (gdzie {Nazwa dzierżawy} jest nazwą katalogu).

Użytkownik standardowy

W przypadku użytkownika standardowego dzierżawy poproś globalnego Administracja istratora o udzielenie zgody administratora na aplikację. W tym celu podaj następujący adres URL administratorowi:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

W adresie URL:

  • Zastąp ciąg Enter_the_Tenant_Id_Here identyfikatorem dzierżawy lub nazwą dzierżawy (na przykład contoso.microsoft.com).
  • Enter_the_Application_Id_Here to identyfikator aplikacji (klienta) zarejestrowanej aplikacji.

Błąd AADSTS50011: No reply address is registered for the application może być wyświetlany po udzieleniu zgody aplikacji przy użyciu poprzedniego adresu URL. Ten błąd występuje, ponieważ aplikacja i adres URL nie mają identyfikatora URI przekierowania. Możesz go zignorować.

Czy wywołujesz własny interfejs API?

Jeśli aplikacja demona wywołuje własny internetowy interfejs API i nie możesz dodać uprawnienia aplikacji do rejestracji aplikacji demona, musisz dodać role aplikacji do rejestracji aplikacji internetowego interfejsu API.

Następne kroki

Przejdź do następnego artykułu w tym scenariuszu Wywoływanie internetowego interfejsu API.