Dotyczy: Dzierżawcy siły roboczej Biały okrąg z szarym symbolem X. dzierżawcy zewnętrzni (White circle with a gray X symbol.dowiedz się więcej)
Aplikacje demona platformy .NET mogą wywoływać internetowy interfejs API. Aplikacje demona platformy .NET mogą również wywoływać kilka wstępnie zatwierdzonych internetowych interfejsów API.
Wywoływanie webowego interfejsu API z aplikacji demona
Poniżej przedstawiono sposób wywoływania interfejsu API przy użyciu tokenu:
Microsoft.Identity.Web upraszcza złożoność MSAL.NET. Udziela interfejsów API wyższego poziomu, które obsługują aspekty wewnętrzne MSAL.NET, takie jak przetwarzanie błędów związanych z dostępem warunkowym i buforowanie.
Oto Program.cs aplikacji demona wywołującej podrzędny interfejs API:
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();
tokenAcquirerFactory.Services.AddDownstreamApi("MyApi",
tokenAcquirerFactory.Configuration.GetSection("MyWebApi"));
var sp = tokenAcquirerFactory.Build();
var api = sp.GetRequiredService<IDownstreamApi>();
var result = await api.GetForAppAsync<IEnumerable<TodoItem>>("MyApi");
Console.WriteLine($"result = {result?.Count()}");
Oto plik Program.cs z aplikacji demona, która wywołuje usługę Microsoft Graph.
var tokenAcquirerFactory = TokenAcquirerFactory.GetDefaultInstance();
tokenAcquirerFactory.Services.AddMicrosoftGraph();
var serviceProvider = tokenAcquirerFactory.Build();
try
{
GraphServiceClient graphServiceClient = serviceProvider.GetRequiredService<GraphServiceClient>();
var users = await graphServiceClient.Users
.GetAsync(r => r.Options.WithAppOnly());
Console.WriteLine($"{users.Count} users");
Console.ReadKey();
}
catch (Exception ex) { Console.WriteLine("We could not retrieve the user's list: " + $"{ex}"); }
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("Authorization", "Bearer " + accessToken);
conn.setRequestProperty("Accept", "application/json");
String response = HttpClientHelper.getResponseStringFromConn(conn);
int responseCode = conn.getResponseCode();
if(responseCode != HttpURLConnection.HTTP_OK) {
throw new IOException(response);
}
JSONObject responseObject = HttpClientHelper.processResponse(responseCode, response);
Używając klienta HTTP, takiego jak Axios, wywołaj identyfikator URI punktu końcowego interfejsu API z tokenem dostępu jako elementu nośnego autoryzacji.
const axios = require('axios');
async function callApi(endpoint, accessToken) {
const options = {
headers: {
Authorization: `Bearer ${accessToken}`
}
};
console.log('request made to web API at: ' + new Date().toString());
try {
const response = await axios.default.get(endpoint, options);
return response.data;
} catch (error) {
console.log(error)
return error;
}
};
endpoint = "url to the API"
http_headers = {'Authorization': 'Bearer ' + result['access_token'],
'Accept': 'application/json',
'Content-Type': 'application/json'}
data = requests.get(endpoint, headers=http_headers, stream=False).json()
Właściwości AuthenticationResult w MSAL.NET
Metody uzyskiwania tokenów zwracają wartość AuthenticationResult
. W przypadku metod asynchronicznych Task<AuthenticationResult>
zwraca.
W MSAL.NET AuthenticationResult
uwidacznia:
-
AccessToken
aby internetowy interfejs API uzyskiwał dostęp do zasobów. Ten parametr jest ciągiem, zwykle zakodowanym w formacie Base-64 JWT. Klient nigdy nie powinien szukać wewnątrz tokenu dostępu. Format nie ma zagwarantowanej stabilności i można zaszyfrować zasób. Pisanie kodu, który zależy od zawartości tokenu dostępu używanego po stronie klienta, jest jednym z największych źródeł błędów i awarii logiki klienta. Aby uzyskać więcej informacji, zobacz Tokeny dostępu.
-
IdToken
dla użytkownika. Ten parametr jest zakodowany w formacie JWT. Aby uzyskać więcej informacji, zobacz Tokeny identyfikatorów.
-
ExpiresOn
informuje o dacie i godzinie wygaśnięcia tokenu.
-
TenantId
zawiera dzierżawcę, w którym użytkownik został znaleziony. W scenariuszach dla użytkowników-gości w Microsoft Entra B2B, identyfikator dzierżawy odnosi się do dzierżawy gościnnej, a nie dzierżawy unikalnej.
Gdy token jest dostarczany dla użytkownika, AuthenticationResult
zawiera również informacje o tym użytkowniku. W przypadku poufnych przepływów klienta, w których tokeny są żądane bez użytkownika dla aplikacji, te informacje o użytkowniku mają wartość null.
- Element
Scopes
, dla którego wystawiono token.
- Unikatowy identyfikator użytkownika.
IAccount
MSAL.NET definiuje pojęcie konta za pośrednictwem interfejsu IAccount
. Ta zmiana łamiąca zapewnia właściwą semantykę. Ten sam użytkownik może mieć kilka kont w różnych katalogach firmy Microsoft Entra. Ponadto MSAL.NET dostarcza bardziej szczegółowe informacje w przypadku scenariuszy użytkowników gościnnych, ponieważ dostarczane są dane o koncie głównym.
Na poniższym diagramie przedstawiono strukturę interfejsu IAccount
.
Klasa AccountId
identyfikuje konto w określonej dzierżawie z właściwościami przedstawionymi w poniższej tabeli.
Własność |
opis |
TenantId |
Reprezentacja ciągu znaków dla identyfikatora GUID, który jest identyfikatorem dzierżawcy, gdzie znajduje się konto. |
ObjectId |
Ciąg znaków reprezentujący identyfikator GUID, który należy do użytkownika będącego właścicielem konta w dzierżawie. |
Identifier |
Unikatowy identyfikator konta.
Identifier to łączenie ObjectId i TenantId oddzielane przecinkami. Nie są one zakodowane w formacie Base 64. |
Interfejs IAccount
reprezentuje informacje o pojedynczym koncie. Ten sam użytkownik może być obecny w różnych dzierżawach, co oznacza, że użytkownik może mieć wiele kont. Jego członkowie są wyświetleni w poniższej tabeli.
Własność |
opis |
Username |
Ciąg zawierający wartość wyświetlaną w formacie UserPrincipalName (UPN), na przykład john.doe@contoso.com. Ten ciąg może mieć wartość null, w przeciwieństwie do parametrów HomeAccountId i HomeAccountId.Identifier, które nie będą mieć wartości null. Ta właściwość zastępuje właściwości DisplayableId w starszych wersjach IUser w MSAL.NET. |
Environment |
Ciąg zawierający dostawcę tożsamości dla tego konta, na przykład login.microsoftonline.com . Ta właściwość zastępuje właściwość IdentityProvider IUser , z wyjątkiem że IdentityProvider zawierała również informacje o najemcy, oprócz środowiska chmury. Tutaj wartość ma znaczenie tylko jako host. |
HomeAccountId |
Identyfikator konta domowego użytkownika. Ta właściwość jednoznacznie identyfikuje użytkownika w dzierżawach Microsoft Entra. |
Wywoływanie chronionego interfejsu API przy użyciu tokenu
Po zwróceniu przez MSAL w AuthenticationResult
, dodaj go do nagłówka autoryzacji HTTP przed wykonaniem wywołania w celu uzyskania dostępu do chronionego interfejsu API.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Wywoływanie kilku interfejsów API
W przypadku aplikacji demona webowe interfejsy API, które wywołujesz, muszą zostać wstępnie zatwierdzone. Nie ma stopniowej zgody dla aplikacji działających w tle. (Nie ma interakcji z użytkownikiem). Administrator dzierżawy musi wcześniej wyrazić zgodę na aplikację i wszystkie uprawnienia interfejsu API. Jeśli chcesz wywołać kilka interfejsów API, uzyskaj token dla każdego zasobu przy każdym wywołaniu metody AcquireTokenForClient
. Biblioteka MSAL używa pamięci podręcznej tokenów aplikacji, aby uniknąć niepotrzebnych wywołań usługi.
Następne kroki
Dowiedz się więcej, tworząc aplikację jednostronicową React (SPA), która loguje użytkowników w poniższej serii samouczków wieloczęściowych.
Eksplorowanie przykładów kodu usługi/demon na platformie tożsamości Microsoft