Adquirir tokens para chamar uma API Web usando um aplicativo daemon

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

Adquirir um token para um aplicativo cliente confidencial

Aplicativos Daemon e outros aplicativos cliente confidenciais executados sem interação do usuário usam o fluxo de credenciais do cliente OAuth 2.0 para adquirir tokens de acesso somente de aplicativo. Este artigo explica como configurar os escopos necessários, chamar a AcquireTokenForClient API (ou seu equivalente de plataforma) para adquirir um token e solucionar problemas de erros comuns. Antes de continuar, verifique se você já criou um aplicativo cliente confidencial.

Escopos a solicitar

O escopo a ser solicitado para um fluxo de credenciais do cliente é o nome do recurso seguido por /.default. A notação /.default instrui o Microsoft Entra ID a usar as permissões em nível de aplicativo declaradas estaticamente durante o registro do aplicativo. Além disso, essas permissões de API precisam ser concedidas por um administrador de locatários.

Veja um exemplo de definição dos escopos para a API Web como parte da configuração em um arquivo appsettings.json. Este exemplo foi extraído do exemplo de código daemon de console do .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 sempre deve ser a ID de recurso seguida 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 extrai o público-alvo desejado a partir do escopo solicitado, tomando tudo o que vem antes da última barra e usando isso como identificador do recurso. Portanto, se, como o Banco de Dados SQL do Azure (https://database.windows.net), o recurso espera um público-alvo que termina com uma barra (para o Banco de Dados SQL do Azure, https://database.windows.net/), você precisa solicitar um escopo de https://database.windows.net//.default. (Observe a barra dupla.) Veja também o problema MSAL.NET #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 Microsoft. Identity.Web, você não precisa adquirir um token diretamente. Você pode usar APIs de nível superior, como você vê em Chamar uma API Web de um aplicativo daemon. Se, no entanto, você estiver usando um SDK que exija um token, poderá obter um token de aplicativo por meio da ITokenAcquirer abstração, conforme mostrado no exemplo a seguir:

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 tiver uma biblioteca para a linguagem escolhida, talvez queira usar o protocolo diretamente:

Primeiro caso: Acesse 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 mais informações, consulte a documentação do protocolo: plataforma de identidade da Microsoft e o fluxo de credenciais do cliente do OAuth 2.0.

Soluçã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 o erro Privilégios insuficientes para concluir a operação ao chamar a API, o administrador do locatário precisará conceder permissões ao aplicativo.

Se você não conceder consentimento de administrador ao seu aplicativo, a API retornará uma resposta de erro semelhante ao exemplo a seguir:

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 opções a seguir, dependendo da função.

Administrador de Aplicativos de Nuvem

Para um administrador de aplicativos em nuvem, vá para Aplicativos corporativos 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 {Tenant Name} (em que {Tenant Name} é 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 aplicativos da nuvem para conceder o consentimento de administrador ao aplicativo. Para solicitar consentimento, direcione o administrador para a seguinte URL do ponto de extremidade 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 pela ID ou pelo nome do locatário (por exemplo, contoso.microsoft.com).
  • Enter_the_Application_Id_Here é a ID do aplicativo (cliente) que você registrou.

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

Você está recorrendo a sua própria API?

Se o aplicativo daemon chamar sua API Web e você não tiver conseguido adicionar uma permissão de aplicativo ao registro de aplicativo do daemon, será necessário Adicionar funções de aplicativo ao registro de aplicativo da API Web.

Próximas etapas

Vá para o próximo artigo nesse cenário, Recorrendo a uma API Web.