Las aplicaciones de demonio de .NET pueden llamar a una API web. Las aplicaciones de demonio .NET también pueden llamar a varias API web aprobadas previamente.
Microsoft.Identity.Web abstrae la complejidad de MSAL.NET. Le proporciona API de nivel superior que controlan los elementos internos de MSAL.NET por usted, como el procesamiento de errores de acceso condicional, el almacenamiento en caché.
Este es el archivo Program.cs de la aplicación de demonio que llama a una API de bajada:
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()}");
Este es el archivo Program.cs de una aplicación de demonio que llama a 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);
Con un cliente HTTP como Axios, llame al URI del punto de conexión de la API con un token de acceso como portador de autorización.
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()
Propiedades de AuthenticationResult en MSAL.NET
Los métodos para adquirir tokens devuelven AuthenticationResult
. En el caso de los métodos asincrónicos, se devuelve Task<AuthenticationResult>
.
En MSAL.NET, AuthenticationResult
expone:
AccessToken
para que la API web acceda a los recursos. Este parámetro es una cadena, normalmente un JWT con codificación en Base 64. El cliente nunca debe mirar dentro del token de acceso. No se garantiza que el formato permanezca estable y se pueda cifrar para el recurso. La escritura de código que depende del contenido de un token de acceso del cliente constituye una de las fuentes de errores y de interrupciones de la lógica de cliente más habituales. Para más información, consulte Tokens de acceso.
IdToken
del usuario. Este parámetro es un JWT codificado. Para más información, consulte Tokens de id.
ExpiresOn
indica el día y la hora a la que expira el token.
TenantId
indica el inquilino en el que se encontró el usuario. Para usuarios invitados en escenarios Microsoft Entra B2B, el id. de inquilino es el inquilino invitado, no el inquilino único.
Cuando se entrega el token para un usuario, AuthenticationResult
también contiene información sobre dicho usuario. Para los flujos de cliente confidenciales en los que se solicitan tokens sin usuario para la aplicación, esta información de usuario está vacía.
- Los
Scopes
para los que se emitió el token.
- El identificador único del usuario.
IAccount
MSAL.NET define la noción de una cuenta mediante la interfaz IAccount
. Este cambio importante proporciona la semántica correcta. El mismo usuario puede tener varias cuentas, en diferentes directorios de Microsoft Entra. También MSAL.NET proporciona mejor información en el caso de escenarios de invitado ya que se proporciona información de la cuenta doméstica.
En el siguiente diagrama se muestra la estructura de la interfaz IAccount
.
La clase AccountId
identifica una cuenta en un inquilino específico con las propiedades que se muestran en la tabla siguiente.
Propiedad |
Descripción |
TenantId |
Representación de una cadena en un GUID, que es el identificador del inquilino donde reside la cuenta. |
ObjectId |
Representación de una cadena en un GUID, que es el identificador del usuario a quien pertenece la cuenta en el inquilino. |
Identifier |
Identificador único de la cuenta. Identifier es la concatenación de ObjectId y TenantId , separados por una coma. No están codificados en Base 64. |
La interfaz IAccount
representa información sobre una sola cuenta. El mismo usuario puede estar presente en distintos inquilinos, es decir, un usuario puede tener varias cuentas. Sus miembros se muestran en la siguiente tabla.
Propiedad |
Descripción |
Username |
Una cadena que contiene el valor que se puede mostrar en formato UserPrincipalName (UPN), por ejemplo, john.doe@contoso.com. Esta cadena puede ser NULL, a diferencia de HomeAccountId y HomeAccountId.Identifier que no serán NULL. Esta propiedad reemplaza la propiedad DisplayableId de IUser en versiones anteriores de MSAL.NET. |
Environment |
Una cadena que contiene el proveedor de identidades de esta cuenta, por ejemplo, login.microsoftonline.com . Esta propiedad reemplaza la propiedad IdentityProvider de IUser , salvo que IdentityProvider también tenía información sobre el inquilino además del entorno de nube. Aquí, el valor es solo el host. |
HomeAccountId |
El identificador de la cuenta de inicio del usuario. Esta propiedad identifica unívocamente al usuario a través de los inquilinos de Microsoft Entra. |
Uso del token para llamar a una API protegida
Después de que MSAL devuelva AuthenticationResult
en result
, agréguelo al encabezado de autorización HTTP antes de realizar la llamada para acceder a la API web protegida.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Para las aplicaciones demonio, las API web a las que llame deben estar aprobadas previamente. No hay ningún consentimiento incremental con las aplicaciones de demonio. (No hay interacción del usuario). El administrador de inquilinos debe dar el consentimiento previo a la aplicación y a todos los permisos de la API. Si quiere llamar a varias API, adquiera un token para cada recurso, cada vez llamando a AcquireTokenForClient
. MSAL usa la caché del token de la aplicación para evitar las llamadas de servicio innecesarias.