Adquira tokens para chamar uma API da Web usando um aplicativo daemon

Aplica-se a: círculo verde com um símbolo de marca de seleção branco que indica que o conteúdo a seguir se aplica aos locatários da força de trabalho. Inquilinos da força de trabalho (saiba mais)

Adquira um token para uma aplicação cliente confidencial

Aplicações daemon e outras aplicações clientes confidenciais que funcionam sem interação do utilizador utilizam o fluxo de credenciais do cliente OAuth 2.0 para adquirir tokens de acesso exclusivos da aplicação. Este artigo explica como configurar os escopos necessários, chamar a AcquireTokenForClient API (ou o seu equivalente na plataforma) para adquirir um token e resolver erros comuns. Antes de continuar, certifique-se de que já criou uma aplicação cliente confidencial.

Escopos a solicitar

O escopo para solicitar um fluxo de credenciais de cliente é o nome do recurso seguido por /.default. A notação /.default indica ao Microsoft Entra ID que utilize as permissões de nível de aplicação declaradas estaticamente aquando do registo da aplicação. Além disso, essas permissões de API devem ser concedidas por um administrador de locatário.

Aqui está um exemplo de definição dos escopos para a API da Web como parte da configuração em um arquivo de appsettings.json. Este exemplo é retirado do exemplo de código de daemon de consola .NET no GitHub.

{
    "AzureAd": {
        // Same AzureAd section as before.
    },

    "MyWebApi": {
        "BaseUrl": "https://localhost:44372/",
        "RelativePath": "api/TodoList",
        "RequestAppToken": true,
        "Scopes": [ "[Enter here the scopes for your web API]" ]
    }
}

Recursos do Azure AD (v1.0)

O escopo usado para credenciais de cliente deve ser sempre o ID do recurso seguido por /.default.

Importante

Quando o MSAL solicita um token de acesso para um recurso que aceita um token de acesso da versão 1.0, o Microsoft Entra ID analisa o público desejado a partir do escopo solicitado, capturando tudo antes da última barra e utiliza-o como identificador do recurso. Portanto, se, como o Base de Dados SQL do Azure (https://database.windows.net), o recurso espera uma audiência que termina com uma barra (para o Base de Dados SQL do Azure, https://database.windows.net/), precisarás solicitar um escopo de https://database.windows.net//.default. (Observe a barra dupla.) Ver também MSAL.NET edição #747: Resource url's trailing slash is omitted, which caused sql auth failure.

AcquireTokenForClient API

Para adquirir um token para o aplicativo, use AcquireTokenForClient ou seu equivalente, dependendo da plataforma.

Com a Microsoft. Identity.Web, não precisas de adquirir um token diretamente. Você pode usar APIs de nível superior, como se vê em Chamando uma API da Web a partir de uma aplicação daemon. Se, no entanto, estiver a usar um SDK que requer um token, pode obter um token de aplicação através da ITokenAcquirer abstração, como mostrado no exemplo seguinte:

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();
ITokenAcquirer acquirer = tokenAcquirerFactory.GetTokenAcquirer();
AcquireTokenResult tokenResult = await acquirer.GetTokenForUserAsync(new[] { "https://graph.microsoft.com/.default" });
string accessToken = tokenResult.AccessToken;

Protocolo

Se você ainda não tem uma biblioteca para o idioma escolhido, convém usar o protocolo diretamente:

Primeiro caso: acessar a solicitação de token usando um segredo compartilhado

POST /{tenant}/oauth2/v2.0/token HTTP/1.1           //Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=A1b-C2d_E3f.H4i,J5k?L6m!N7o-P8q_R9s.T0u
&grant_type=client_credentials

Segundo caso: acessar a solicitação de token usando um certificado

POST /{tenant}/oauth2/v2.0/token HTTP/1.1               // Line breaks for clarity.
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_id=11112222-bbbb-3333-cccc-4444dddd5555
&client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwt-bearer
&client_assertion=aaaaaaaa-0b0b-...
&grant_type=client_credentials

Para obter mais informações, consulte a documentação do protocolo: plataforma de identidade da Microsoft e o fluxo de credenciais do cliente OAuth 2.0.

Resolução de Problemas

Você usou o escopo resource/.default?

Se você receber uma mensagem de erro informando que usou um escopo inválido, provavelmente não usou o resource/.default escopo.

Se você receber um erro de privilégios insuficientes para concluir a operação ao chamar a API, o administrador do locatário precisará conceder permissões ao aplicativo.

Se não der consentimento do administrador à sua aplicação, a API devolve uma resposta de erro semelhante ao seguinte exemplo:

Failed to call the web API: Forbidden
Content: {
  "error": {
    "code": "Authorization_RequestDenied",
    "message": "Insufficient privileges to complete the operation.",
    "innerError": {
      "request-id": "<guid>",
      "date": "<date>"
    }
  }
}

Selecione uma das seguintes opções, dependendo da função.

Administrador de Aplicações na Cloud

Para um Administrador de Aplicações na Cloud, aceda a aplicações empresariais no centro de administração do Microsoft Entra. Selecione o registro do aplicativo e selecione Permissões na seção Segurança do painel esquerdo. Em seguida, selecione o botão grande rotulado Conceder consentimento de administrador para {Nome do locatário} (onde {Nome do locatário} é o nome do diretório).

Usuário padrão

Para um usuário padrão do seu locatário, peça a um administrador de aplicativo na nuvem para conceder consentimento de administrador ao aplicativo. Para solicitar consentimento, dirija o administrador para a seguinte URL do endpoint de consentimento do administrador:

https://login.microsoftonline.com/Enter_the_Tenant_Id_Here/adminconsent?client_id=Enter_the_Application_Id_Here

Na URL:

  • Substitua Enter_the_Tenant_Id_Here pelo ID do locatário ou nome do locatário (por exemplo, contoso.microsoft.com).
  • Enter_the_Application_Id_Here é o ID da aplicação (cliente) para a aplicação registada.

O erro AADSTS50011: No reply address is registered for the application pode ser exibido depois que você concede consentimento para o aplicativo usando a URL anterior. O AADSTS50011 erro ocorre porque a aplicação e o URL não têm um URI de redirecionamento. Você pode ignorar esse erro com segurança.

Você está chamando sua própria API?

Se a sua aplicação daemon chamar a sua própria API Web e não conseguir adicionar uma permissão à inscrição da aplicação do daemon, será necessário Adicionar funções de aplicação à inscrição da API Web.

Próximos passos

Passe para o próximo artigo neste cenário, Chamando uma API da Web.