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.
Microsoft.Identity.Web oddziela złożoność MSAL.NET. Udostępnia on interfejsy API wyższego poziomu obsługujące wewnętrzne MSAL.NET, takie jak przetwarzanie błędów dostępu warunkowego, 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 Program.cs aplikacji demona, która wywołuje program 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 wartość .
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 jest gwarantowany, aby zachować stabilność i można go zaszyfrować dla zasobu. Pisanie kodu zależnego od zawartości tokenu dostępu od klienta jest jednym z największych źródeł błędów i podziałów 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żawę, w której został znaleziony użytkownik. W przypadku użytkowników-gości w scenariuszach firmy Microsoft Entra B2B identyfikator dzierżawy jest dzierżawą gościa, a nie unikatową dzierżawą.
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 powodująca niezgodność zapewnia właściwą semantyka. Ten sam użytkownik może mieć kilka kont w różnych katalogach firmy Microsoft Entra. Ponadto MSAL.NET zapewnia lepsze informacje w przypadku scenariuszy gościa, ponieważ podano informacje 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łaściwości |
opis |
TenantId |
Reprezentacja ciągu dla identyfikatora GUID, który jest identyfikatorem dzierżawy, w której znajduje się konto. |
ObjectId |
Reprezentacja ciągu dla identyfikatora GUID, który jest identyfikatorem użytkownika, który jest 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 elementy członkowskie są wyświetlane w poniższej tabeli.
Właściwości |
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 DisplayableId właściwość IUser w poprzednich wersjach 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 IdentityProvider właściwość IUser , z tą różnicą, że IdentityProvider oprócz środowiska chmury zawiera również informacje o dzierżawie. W tym miejscu wartość jest tylko hostem. |
HomeAccountId |
Identyfikator konta głównego użytkownika. Ta właściwość jednoznacznie identyfikuje użytkownika w dzierżawach firmy Microsoft Entra. |
Wywoływanie chronionego interfejsu API przy użyciu tokenu
Po AuthenticationResult
powrocie przez bibliotekę MSAL w result
pliku dodaj go do nagłówka autoryzacji HTTP przed wywołaniem w celu uzyskania dostępu do chronionego internetowego interfejsu API.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
W przypadku aplikacji demona internetowe interfejsy API, które wywołujesz, muszą zostać wstępnie zatwierdzone. Nie ma przyrostowej zgody dla aplikacji demona. (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.