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

Depois de criar um aplicativo cliente confidencial, você pode adquirir um token para o aplicativo chamando AcquireTokenForClient, passando o escopo e, opcionalmente, forçando uma atualização do token.

Escopos a solicitar

O escopo para solicitar um fluxo de credenciais de cliente é o nome do recurso seguido por /.default. Essa notação informa ao Microsoft Entra ID para usar as permissões de nível de aplicativo declaradas estaticamente durante o registro do aplicativo. 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 do console .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 ID do Microsoft Entra analisa o público desejado a partir do escopo solicitado, pegando tudo antes da última barra e usando-o como o identificador de recurso. Portanto, se, como o Banco de Dados SQL do Azure (https://database.windows.net), o recurso espera uma audiência que termina com uma barra (para o Banco de Dados SQL do Azure, https://database.windows.net/), você precisará 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 Microsoft.Identity.Web, você não precisa adquirir um token. Você pode usar APIs de nível superior, como você vê em Chamando uma API da Web de um aplicativo daemon. Se, no entanto, você estiver usando um SDK que exija um token, o trecho de código a seguir mostra como obter esse token.

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 você não conceder consentimento de administrador para seu aplicativo, você encontrará o seguinte erro:

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 locatário global

Para um administrador de locatário global, 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 {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 Global que conceda consentimento de administrador para o aplicativo. Para fazer isso, forneça a seguinte URL para o administrador:

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

No 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 do aplicativo (cliente) para o aplicativo registrado.

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. Este erro ocorre porque o aplicativo e a URL não têm um URI de redirecionamento. Isto pode ser ignorado.

Você está chamando sua própria API?

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

Próximos passos

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