Os aplicativos daemon .NET podem chamar uma API da Web. Os aplicativos daemon .NET também podem chamar várias APIs da Web pré-aprovadas.
Microsoft.Identity.Web abstrai a complexidade do MSAL.NET. Ele fornece APIs de nível mais alto que lidam com as partes internas do MSAL.NET para você, como processamento de erros de Acesso Condicional, cache.
Aqui está a 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()}");
Aqui está 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 o Axios, chame o URI do ponto de extremidade da API com um token de acesso como portador da 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()
AuthenticationResult propriedades em MSAL.NET
Os métodos para adquirir tokens retornam AuthenticationResult
. Para métodos assíncronos, Task<AuthenticationResult>
retorna.
Em MSAL.NET, AuthenticationResult
expõe:
AccessToken
para a API da Web acessar recursos. Este parâmetro é uma cadeia de caracteres, geralmente um JWT codificado em Base-64. O cliente nunca deve olhar para dentro do token de acesso. Não é garantido que o formato permaneça estável e pode ser criptografado para o recurso. Escrever 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 utilizador. Este 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 no qual o usuário foi encontrado. Para 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 clientes confidenciais em que os tokens são solicitados sem usuário para o aplicativo, essas informações do usuário são nulas.
- O
Scopes
para o qual o token foi emitido.
- O ID exclusivo para o usuário.
IAccount
MSAL.NET define a noção de uma conta através da IAccount
interface. Esta mudança de rutura fornece a semântica correta. O mesmo usuário pode ter várias contas, em diferentes diretórios do Microsoft Entra. Além disso, MSAL.NET fornece melhores informações no caso de cenários de convidados, porque as informações da conta doméstica são fornecidas.
O diagrama a seguir mostra a estrutura da IAccount
interface.
A AccountId
classe identifica uma conta em um locatário específico com as propriedades mostradas na tabela a seguir.
Property |
Description |
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 e TenantId separada ObjectId por uma vírgula. Eles não são codificados na Base 64. |
A IAccount
interface 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.
Property |
Description |
Username |
Uma cadeia de caracteres que contém o valor exibível no formato UPN (UserPrincipalName), por exemplo, john.doe@contoso.com. Essa cadeia de caracteres pode ser null, ao contrário de HomeAccountId e HomeAccountId.Identifier, que não serão nulos. Esta propriedade substitui a DisplayableId propriedade de IUser em versões anteriores do MSAL.NET. |
Environment |
Uma cadeia de caracteres que contém o provedor de identidade para essa conta, por exemplo, login.microsoftonline.com . Esta propriedade substitui a IdentityProvider propriedade da , exceto que IdentityProvider também tinha informações sobre o inquilino, além do ambiente de IUser nuvem. Aqui, o valor é apenas o host. |
HomeAccountId |
O ID da conta inicial do usuário. Essa propriedade identifica exclusivamente o usuário entre os locatários do Microsoft Entra. |
Usar o token para chamar uma API protegida
Depois AuthenticationResult
de ser retornado pelo MSAL no 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 da Web que você chama precisam ser pré-aprovadas. Não há consentimento incremental com aplicativos daemon. (Não há interação do usuário.) O administrador do locatário precisa fornecer consentimento com antecedência para o aplicativo e todas as permissões da API. Se você quiser chamar várias APIs, adquira um token para cada recurso, cada vez que chamar AcquireTokenForClient
. O MSAL usa o cache de token de aplicativo para evitar chamadas de serviço desnecessárias.