Os aplicativos daemon do .NET podem chamar uma API Web. Os aplicativos daemon do .NET também podem chamar várias APIs Web pré-aprovadas.
O Microsoft.Identity.Web abstrai a complexidade do MSAL.NET. Ele fornece APIs de nível superior que lidam com as partes internas do MSAL.NET, como processamento de erros de acesso condicional e armazenamento em cache.
Veja o Program.cs do aplicativo daemon chamando uma API downstream:
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()}");
Veja o Program.cs de um aplicativo daemon que chama o 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);
Usando um cliente HTTP como Axios, chame o URI do ponto de extremidade da API com um token de acesso como portador de autorização.
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()
Propriedades de AuthenticationResult em MSAL.NET
Os métodos para adquirir retorno de tokens AuthenticationResult
. Para métodos assíncronos, Task<AuthenticationResult>
retorna.
No MSAL.NET, AuthenticationResult
expõe:
AccessToken
para a API da web acessar recursos. Este parâmetro é uma cadeia de caractere, geralmente um JWT codificado em Base 64. O cliente nunca deve olhar dentro do token de acesso. Não há garantia de que o formato permaneça estável e pode ser criptografado para o recurso. A gravação de código que depende do conteúdo do token de acesso no cliente é uma das maiores fontes de erros e quebras de lógica do cliente. Para obter mais informações, consulte Tokens de acesso.
IdToken
para o usuário. Esse parâmetro é um JWT codificado. Para obter mais informações, consulte Tokens de ID.
ExpiresOn
informa a data e a hora em que o token expira.
TenantId
contém o locatário em que o usuário foi encontrado. Para os usuários convidados em cenários B2B do Microsoft Entra, a ID do locatário é o locatário convidado, não o locatário exclusivo.
Quando o token é entregue para um usuário, AuthenticationResult
também contém informações sobre esse usuário. Para fluxos de cliente confidenciais em que tokens são solicitados sem nenhum usuário para o aplicativo, essas informações do usuário são nulas.
- O
Scopes
para o qual o token foi emitido.
- A ID exclusiva para o usuário.
IAccount
MSAL.NET define a noção de uma conta por meio da interface IAccount
. Essa alteração significativa fornece a semântica certa. O mesmo usuário pode ter várias contas, em diferentes diretórios do Microsoft Entra. Além disso, o MSAL.NET fornece melhores informações no caso de cenários de convidado porque as informações da conta doméstica são fornecidas.
O diagrama a seguir mostra a estrutura daIAccount
interface.
A classe AccountId
identifica uma conta em um locatário específico com as propriedades mostradas na tabela a seguir.
Propriedade |
Descrição |
TenantId |
Uma representação de cadeia de caracteres para um GUID, que é a ID do locatário onde a conta reside. |
ObjectId |
Uma representação de cadeia de caracteres para um GUID, que é a ID do usuário que possui a conta no locatário. |
Identifier |
Identificador exclusivo da conta. Identifier é a concatenação de ObjectId e TenantId separada por uma vírgula. Eles não são codificados em Base 64. |
A interface IAccount
representa informações sobre uma única conta. O mesmo usuário pode estar presente em diferentes locatários, o que significa que um usuário pode ter várias contas. Seus membros são mostrados na tabela a seguir.
Propriedade |
Descrição |
Username |
Uma cadeia de caracteres que contém o valor de exibição no formato UserPrincipalName (UPN), por exemplo, john.doe@contoso.com. Essa cadeia de caracteres pode ser nula, ao contrário de HomeAccountId e HomeAccountId.Identifier, que não será nula. Esta propriedade substitui a propriedade DisplayableId de IUser nas versões anteriores do MSAL.NET. |
Environment |
Uma cadeia de caracteres que contém o provedor de identidade para esta conta, por exemplo, login.microsoftonline.com . Esta propriedade substitui aIdentityProvider propriedade de IUser , exceto que IdentityProvider também tinha informações sobre o locatário, além do ambiente de nuvem. Aqui, o valor é apenas o host. |
HomeAccountId |
A ID da conta inicial do usuário. Essa propriedade identifica exclusivamente o usuário nos locatários do Microsoft Entra. |
Use o token para chamar uma API protegida
Depois de AuthenticationResult
ser retornado pelo MSAL em result
, adicione-o ao cabeçalho de autorização HTTP antes de fazer a chamada para acessar a API da web protegida.
httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
// Call the web API.
HttpResponseMessage response = await _httpClient.GetAsync(apiUri);
...
Para aplicativos daemon, as APIs Web que você chama precisam ser pré-aprovadas. Não há consentimento incremental com aplicativos daemon. (Não há nenhuma interação do usuário.) O administrador do locatário precisa fornecer consentimento com antecedência para o aplicativo e todas as permissões de API. Se você quiser chamar várias APIs, adquira um token para cada recurso, sempre chamando AcquireTokenForClient
. O MSAL usa o cache de token do aplicativo para evitar chamadas de serviço desnecessárias.